r - 如何基于多列创建因子以进行绘图
问题描述
我想创建一个包含两个类别 a 和 b 的条形图,其中列的颜色取决于类别。对于他们两个,我都有x
确定类别顺序的字符串。in 的值x
可以出现在两个类别中。现在我想找到一种基于两件事来绘制列的方法:首先,所有元素x
在其词汇顺序中属于类别“a”,然后对于属于类别 b 的元素也是如此。理想情况下,不要沿着 线创建人工 x 列str_c(x, y)
,因为它们已经由图例编码。此外,刻面不是一种选择,因为这已经为另一列完成了。
我找到了一个解决方案,可以用我想要的标签明确地覆盖 x-labels,但我希望看到一种不那么笨拙且可能容易出错的方式!
library(tidyverse)
set.seed(1)
df <-
tibble(
x = c('1', '0', '0', '1'),
y = c('a', 'a', 'b', 'b'),
z = runif(4)
)
df %>%
arrange(y, x) %>%
mutate(ordering = str_c(y, '_', x)) %>%
{
ggplot(., aes(ordering, z, fill = y)) +
geom_col() +
scale_x_discrete(labels = pull(., x))
}
解决方案
你可以做
df %>%
arrange(y, x) %>%
ggplot(aes(interaction(x, y), z, fill = y)) +
geom_col() +
scale_x_discrete(labels = parse_number)
labels
也可以取一个函数而不仅仅是一个字符向量。因此,在这里我传递parse_number
了它将输入解析为数字,从而删除任何字符。您ordering
可以使用interaction
.
如果您使用的不是数字而是其他东西,您可以使用以下方法提取原始 x 值
my_df %>%
arrange(y, x) %>%
ggplot(aes(interaction(x, y, sep = "_"), z, fill = y)) +
geom_col() +
scale_x_discrete("x-axis",
labels = function(x) str_remove(x, "_.*$"))
默认sep
ininteraction
是一个点,可以\\.
在str_remove
函数中匹配,但您也可以指定任何其他字符,这不是标签的一部分。