我试图在 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")
Run Code Online (Sandbox Code Playgroud)
我用来绘制的代码:
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)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,值标签并不像我希望的那样位于每个条的顶部(或底部)。有些是,但很多人不是。
当谈到仅包含正值的标记分组条形图时,我看到了一些例子,使用position= position_dodge(width=0.9)是最好的方法,我同意。我用它得到了最有成效的结果,但它并不完美。
我认为我的问题在于我的 vjust ifelse 声明中。如果我将 vjust 保留为 -0.5 而不是 ifelse 语句,则所有正条实际上都被正确标记,但负值仍在条内,但图像实际上看起来比上面发布的图像更干净。
有想法该怎么解决这个吗?
谢谢
您可以使用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)
Run Code Online (Sandbox Code Playgroud)