首页 > 解决方案 > 如何基于多列创建因子以进行绘图

问题描述

我想创建一个包含两个类别 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))
  }

标签: rggplot2dplyr

解决方案


你可以做

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, "_.*$"))

默认sepininteraction是一个点,可以\\.str_remove函数中匹配,但您也可以指定任何其他字符,这不是标签的一部分。


推荐阅读