【问题标题】:Can I use multiple fill patterns in ggplot2?我可以在 ggplot2 中使用多个填充模式吗?
【发布时间】:2020-11-24 20:30:02
【问题描述】:

我用 geom_col() 在 ggplot2 中创建了一个闪避的条形图。代码如下所示:

cat <- c("A", "A", "A", "A","B", "B", "B", "B")
var <- c("X", "Y", "Z", "T", "X", "Y", "Z", "T")
val <- c(35, 25, 20, 20, 40, 10, 15, 35)
df <- data.frame(var, cat, val)
ggplot(data = df) + 
  geom_col(aes(x = var, y = val, fill = cat), position = "dodge")

这会产生以下情节:

我希望每个变量都有不同的填充颜色,例如 T = 绿色、X = 蓝色等,并且仍然保持类别之间的颜色分离,例如 T-A = 深绿色、T-B = 浅绿色、X-A = 深蓝色、 X-B = 浅蓝色等。

有没有简单的方法来添加这个功能?

谢谢!

【问题讨论】:

    标签: r ggplot2 plot bar-chart


    【解决方案1】:

    我认为最简单的方法是使用 alpha 比例:

    ggplot(data = df) + 
      geom_col(aes(x = var, y = val, fill = var, alpha = cat), 
               position = "dodge") +
      scale_alpha_discrete(range = c(0.5, 1), guide = guide_none()) +
      theme_classic()
    

    如果您真的想在背景中使用网格并且不想看到穿过浅条的线条,请确保在下方绘制一些相同尺寸的白条:

    ggplot(data = df) + 
      geom_col(aes(x = var, y = val, group = cat), 
               position = "dodge", fill = "white", alpha = 1) +
        geom_col(aes(x = var, y = val, fill = var, alpha = cat), 
               position = "dodge") +
      scale_alpha_discrete(range = c(0.5, 1), guide = guide_none())
    

    【讨论】:

    • 谢谢,这是一个极好的解决方案。是否可以将图例放在 A 和 B 作为类别而不是 T、X、Y 和 Z 的一侧?
    • @Pongo 是的,但它们将是一对浅色:深色,以匹配 alpha 美学。我不认为这对传奇人物来说效果很好。你希望它们是什么颜色的?
    • 没关系。我只希望 A 和 B 作为图例中的类别,而不是 T、X、Y 和 Z。
    【解决方案2】:

    也许这会有用:

    library(ggplot2)
    #Data
    cat <- c("A", "A", "A", "A","B", "B", "B", "B")
    var <- c("X", "Y", "Z", "T", "X", "Y", "Z", "T")
    val <- c(35, 25, 20, 20, 40, 10, 15, 35)
    df <- data.frame(var, cat, val)
    #Plot
    ggplot(data = df) + 
      geom_col(aes(x = var, y = val, fill = interaction(var,cat)), position = "dodge")+
      labs(fill='Var')
    

    输出:

    您可以使用scale_fill_*() 自定义颜色。这是一个使用来自ggsci 包的填充比例的示例:

    #Plot 2
    ggplot(data = df) + 
      geom_col(aes(x = var, y = val, fill = interaction(var,cat)), position = "dodge")+
      labs(fill='Var')+
      ggsci::scale_fill_futurama()
    

    输出:

    【讨论】:

    • 非常感谢您的快速回复。
    • @Pongo 总是很开心!
    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 2022-01-02
    • 2013-05-29
    • 2011-06-22
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 2019-04-13
    相关资源
    最近更新 更多