【问题标题】:Change the fill color of one of the dodged bar in ggplot更改 ggplot 中一个闪避条的填充颜色
【发布时间】:2017-01-07 05:33:12
【问题描述】:

我只想为最后一组更改条形图的顺序,只是为了突出显示它。我使用了scale_fill_manual(),但并没有太大帮助。

这是我的代码:

 x<-c(rep(c("Type1", "Type2"),4))
     y<-c(4,5,6,7,3,4,5,2)
     time<-c(2010,2010,2011,2011,2012,2012,2013,2013)
     z<-data.frame(type = x, val=y, Time = time)

     ggplot(data = z, aes(x=Time,y=val)) +
       geom_bar(stat = "identity", position = "dodge", aes(fill=type))+
       scale_fill_manual(values = c(rep(c("white", "gray51"),3),"white","red"))

这是输出:

我希望图表看起来像:

有什么办法可以做到吗?我将不胜感激任何帮助。我查看了change color of only one bar in ggplot,但它似乎与分组数据无关。

【问题讨论】:

  • 你对没有红色的传说有讲究吗?这将是一个棘手的部分......
  • @gregor 我认为如果图例没有任何红色会更好。但是,我是 R 和 ggplot2 的初学者。所以,如果你能指导我如何在没有和有传奇的情况下做到这一点,我将不胜感激。非常感谢你的帮助。我真的很感激。
  • 请参阅我的答案末尾的编辑,以使红色远离传说。

标签: r ggplot2


【解决方案1】:

我的一般口头禅是 ggplot 非常擅长绘制您提供的数据。如果你想让它绘制不同的东西,最简单的方法通常是修改你的数据。

z$type2 = as.character(z$type)
z$type2[z$type == "Type2" & z$Time == 2013] = "Type2 "

我在"Type2 " 中为您要突出显示的行添加了一个偷偷摸摸的额外空间。它将是一个独特的因子级别并获得自己的颜色(甚至使用字母默认值强制为一个不错的顺序)。但在图例标签中会出现相同的情况。

ggplot(data = z, aes(x=Time,y=val)) +
    geom_bar(stat = "identity", position = "dodge", aes(fill=type2))+
    scale_fill_manual(values = c("white", "gray50", "red"))

我认为从图例中省略红色会很困难,但this answer 告诉我,只需将breaks = c("Type1", "Type2") 作为参数添加到scale_fill_manual

【讨论】:

    【解决方案2】:

    用边框突出显示栏怎么样。例如:

    z$hi = with(z, ifelse(type=="Type2" & Time==2013, "Y","N"))
    
    ggplot(data = z, aes(x=Time,y=val)) +
      geom_bar(stat = "identity", position = "dodge", 
               aes(fill=type, colour=hi), size=1) +
      scale_fill_manual(values=c("gray51","white")) +
      scale_colour_manual(values=c(NA,"red")) +
      guides(colour=FALSE)
    

    更新:回应您的评论:我认为线图可以更容易地查看每个type 之间的趋势和关系。例如:

    ggplot(data = z, aes(x=Time,y=val,colour=type)) +
      geom_line() +
      geom_point() +
      geom_point(data=z[z$hi=="Y",], aes(x=Time, y=val), size=4, pch=1, 
                 colour=hcl(195,100,40), stroke=1) +
      scale_y_continuous(limits=c(0,max(z$val))) +
      theme_bw()
    

    【讨论】:

    • 调用内部的颜色比我下面的两步解决方案要好得多。
    • @gregor 和 eipi10——太棒了!我很好奇——你认为有更好的geom_type 来表示上面的数据吗?我读了一些高级 SO 成员的帖子,如果我必须“破解”我们的方式(即更改数据集)以在 ggplot2 上表示某些内容,那么我可能没有选择正确的几何图形。您认为将geom_bar 替换为其他geom_ 会更好吗?我是初学者,已经开始使用ggplot2 约 5 天。所以,我不确定并想咨询你们所有人。我从您在 SO 上的帖子中学到了很多东西。
    • 不,你很好。这一切似乎都不是骇人听闻的。 geom_bar 会自然而然地出现这两种情况。我认为我们的两个解决方案都有教训 - 如果你想突出显示某些内容,让 ggplot 执行此操作的简单方法是在数据中添加列,指示突出显示的内容。
    • 我认为在这里使用线图可能会更好。我添加了一个示例,以便您了解我的意思。
    【解决方案3】:

    使用图例很容易做到这一点,但您可能需要谨慎对待因颜色的突然变化而让用户失望。只需向您的 x 变量添加一个额外的类别,以指示您想要突出显示的位置。

    x<- xHigh <- c(rep(c("Type1", "Type2"),4))
    xHigh[length(xHigh)] <- "Type2_highlight"
    
    myHighlight <- rep("No",length(x))
    myHighlight[length(myHighlight)] <- "Yes"
    y<-c(4,5,6,7,3,4,5,2)
    time<-c(2010,2010,2011,2011,2012,2012,2013,2013)
    z<-data.frame(type = x, xHigh = xHigh, val=y, Time = time, myHighlight = myHighlight)
    
    ggplot(data = z, aes(x=Time,y=val)) +
      geom_bar(stat = "identity", position = "dodge", aes(fill=xHigh))+
      scale_fill_manual(values = c(Type1 = "white", Type2 = "gray51", Type2_highlight = "red"))
    

    突出显示特定条的另一个潜在选择是在它周围画一个框,如下所示:

    ggplot(data = z, aes(x=Time,y=val)) +
      geom_bar(stat = "identity", position = "dodge", aes(fill=type))+
      scale_fill_manual(values = c(Type1 = "white", Type2 = "gray51")) +
      geom_bar(aes(linetype = xHigh)
               , fill = NA
               , stat = "identity", position = "dodge"
               , col = "red"
               , show.legend = FALSE) +
      scale_linetype_manual(values = c(Type1 = 0
                                       , Type2 = 0
                                       , Type2_highlight = 1))
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 2022-01-17
      • 2012-06-23
      相关资源
      最近更新 更多