如何在ggplot2中的分组条形图中标记每个条上的负值和正值

时间:2016-02-26 20:11:07

标签: r ggplot2

我试图在ggplot2中的分组条形图中标记每个条形图。每个组按日期汇总,每个日期有4个值(条)。我已经看到并且实际上有我自己的代码可以正确标记单个负片和正片,但我无法使分组的条形图正常工作。值继续在栏内结束。

我的数据:

    Date <- c("2016-02-19", "2016-02-20", "2016-02-21", "2016-02-22", "2016-02-23", "2016-02-24", "2016-02-25", "2016-02-26", "2016-02-27", "2016-02-28",
"2016-02-29", "2016-03-01", "2016-03-02", "2016-03-03", "2016-03-04")

Date <- as.Date(Date)

Model1 <- c(-0.6, -0.2, 0.1, 0.1, 0.4, -0.2, -1.7, 0.7, 3.6, 2.0, NA, NA, NA, NA, NA)

Model2 <- c(-0.5, -0.2, -0.5,  0.0,  0.0, -1.0, -0.9,  1.6,  3.6, -0.2,  2.1,  7.8,  3.5, -3.4, -8.1)

Model3 <- c( -0.7,  0.0,  0.2,  0.4,  0.8,  0.6,  0.8, -0.4, -0.6,  0.2,  0.1, -0.9, -0.5,  0.1,  0.3)

Model4 <- c(-0.4, -0.1, -0.2, -0.2, -0.7, -1.5, -1.5, -1.5,  0.1,  1.3,  1.1,  0.9,  0.2, -1.1, -1.7)

df <- data.frame(Date, Model1, Model2, Model3, Model4)

df <- melt(df, id.vars="Date", value.name="Value", variable.name = "model")

我用来绘制的代码:

dfplot <- ggplot(df, aes(x = Date, y = Value, fill = model)) + 
  geom_bar(position = "dodge",stat = "identity", aes(fill= model)) +
  scale_fill_manual(values = c("red","blue", "dark green", "purple"))+
  geom_text(aes(label= Value),position = position_dodge(width = 0.9),
  vjust = ifelse(df[,3]>=0, -0.5, 1) , size= 3)

My result

正如您所看到的,值标签不在我想要的每个栏的顶部(或底部)。有些是,但很多不是。

当谈到标记为仅具有正值的分组条形图时,我看到使用position= position_dodge(width=0.9)的示例是最好的方法,我同意。我用它获得了最有成效的结果,但它并不完美。

我认为我的问题存在于我的vjust ifelse声明中。如果我将vjust保留为-0.5而不是ifelse语句,则所有正条实际上都被正确标记,但负值仍在条形内,但图像实际上看起来比上面发布的更清晰。

有关如何解决此问题的任何想法?

由于

1 个答案:

答案 0 :(得分:4)

您可以使用aes(x,y)代替vjust

geom_text(aes(label= Value, 
              x=Date, 
              y=Value+ifelse(Value>=0,0.01, -0.5)),
          position = position_dodge(width = 0.9),
          vjust = -0.5 , size= 3)

enter image description here