【问题标题】:Labelling stacked bar chart with positive and negative values用正负值标记堆积条形图
【发布时间】:2019-07-22 20:25:19
【问题描述】:

我正在使用 ggplot2 创建一个带有负值的堆积条形图,并尝试在每个条形图的顶部添加部分的总和作为标签。该代码适用于没有负值的条形图,但存在负值时的标签会留在条形图内。

例子:

test = c("Test1", "Test1", "Test1", "Test2", "Test2", "Test2", "Test3", "Test3", "Test3")  
student = c("A", "B", "C", "A", "B", "C", "A", "B", "C")  
value = c(5,5,5,3,3,3,-2,6,7)

dummy = data.frame(test, student, value)

g = ggplot(data=dummy, aes(x=student, y=value, fill=test)) +   
      geom_bar(stat="identity") +   
      scale_fill_manual(values=c("brown4", "steelblue", "goldenrod3")) +
      geom_text(aes(label=value), size =3, position=position_stack(vjust=0.5), colour="white") +
      theme_classic() + 
      theme(text=element_text(family="serif", size=15, colour="black")) +   
      theme(axis.title=element_text(family="serif", size=15, colour="black")) +   
      theme(legend.title = element_blank()) +   
      theme(legend.position = c(0.2, 0.7)) +
      stat_summary(fun.y = sum, aes(label = ..y.., group = student), geom = "text", vjust = -1) +
      scale_y_continuous(limits = c(-4,20))

g

结果如下图:

没有负值的条的总和在条的顶部可以正常工作,但具有负值的条(学生 A)的总和位于红色条的中间。

我该如何解决这个问题?

【问题讨论】:

  • 对不起,第一次在这里发帖。现已编辑。
  • 主要道具为您的第一个问题提供了一个很好的可重复示例。让帮助变得非常容易。

标签: r ggplot2 label bar-chart


【解决方案1】:

您使用fun.y = sum 作为汇总函数,它将组中的所有y 值相加,包括负值。这给出了标签的正确总和,但位置不好。对于位置计算,我们只想计算大于 0 的值的总和。

stat_summary 让我们指定最多 3 个函数,fun.yfun.yminfun.ymax。我们将修改位置fun.y,使其成为正值的总和,并将fun.ymax 添加为常规sum,并将其用于标签:

g = ggplot(data=dummy, aes(x=student, y=value, fill=test)) +   
      geom_bar(stat="identity") +   
      scale_fill_manual(values=c("brown4", "steelblue", "goldenrod3")) +
      geom_text(aes(label=value), size =3, position=position_stack(vjust=0.5), colour="white") +
      theme_classic() + 
      theme(text=element_text(family="serif", size=15, colour="black")) +   
      theme(axis.title=element_text(family="serif", size=15, colour="black")) +   
      theme(legend.title = element_blank()) +   
      theme(legend.position = c(0.2, 0.7)) +
      stat_summary(fun.y = function(y) sum(y[y > 0]), fun.ymax = sum,
                   aes(label = ..ymax.., group = student), geom = "text", vjust = -1) +
      scale_y_continuous(limits = c(-4,20))
g

【讨论】:

  • 巧妙使用ymax!!我喜欢它。
  • 谢谢格雷戈尔。我已经这样做了,它说它是记录,但它没有出现在页面中,因为我的声誉不到 15...很奇怪,但再次感谢,易于工作的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 2020-09-30
  • 2012-11-23
  • 2020-07-15
相关资源
最近更新 更多