gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:18:03 25 4
gpt4 key购买 nike

我正在尝试在 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 语句,则所有正条实际上都被正确标记,但负值仍在条内,但图像实际上看起来比上面发布的图像更干净。

关于如何解决这个问题有什么想法吗?

谢谢

最佳答案

您可以使用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

关于r - 如何在 ggplot2 分组条形图中标记每个条形上的负值和正值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35660836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com