【问题标题】:How to create a factor based on multiple columns for plotting如何基于多列创建因子以进行绘图
【发布时间】:2019-10-11 18:40:33
【问题描述】:

我想创建一个包含两个类别 a 和 b 的条形图,其中列的颜色取决于类别。对于他们两个,我都有字符串x 来确定类别顺序。 x 中的值可以出现在这两个类别中。现在我想找到一种基于两件事来绘制列的方法:首先,x 的所有元素按其词汇顺序属于类别“a”,然后对于属于类别 b 的元素也是如此。理想情况下,沿着str_c(x, y) 的行创建一个人工x 列,因为它们已经由图例编码。 此外,分面不是一种选择,因为这已经为另一列完成了。

我找到了一个solution,它用我想要的标签明确地覆盖了 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))
  }

【问题讨论】:

    标签: r ggplot2 dplyr


    【解决方案1】:

    你可以的

    df %>%
      arrange(y, x) %>%      
      ggplot(aes(interaction(x, y), z, fill = y)) +
      geom_col() +
      scale_x_discrete(labels = parse_number)
    

    labels 也可以接受一个函数,而不仅仅是一个字符向量。因此,在这里我通过parse_number 将输入解析为数字,从而删除任何字符。您可以使用interaction,而不是创建新列ordering

    如果您使用的不是数字而是其他东西,您可以使用

    提取原始 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, "_.*$"))
    

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

    【讨论】:

    • 感谢您的回答! x 轴实际上是一个版本,所以我不得不求助于正则表达式从连接的字符串中再次提取版本?此外,在我的数据中,我收到了警告,尽管报告的两列都是字符类型
    • 请不要使用有关您的问题的其他信息来编辑我的答案。你确定这两列是字符吗?请与str(you_data) 联系。是的,当您的原始 x 和 y 值不同时,您可能必须重新使用正则表达式。
    • 对不起,那是个意外!非常感谢,这真的很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2021-01-25
    • 1970-01-01
    相关资源
    最近更新 更多