【问题标题】:r add text to dodged barplotr 将文本添加到闪避的条形图
【发布时间】:2015-04-21 03:56:23
【问题描述】:

这是部分数据:

CHAIN <- rep(1:4, 2)
variable <- rep(c("EMPFT", "EMPFT2"), each=4)
variable <- factor(variable, levels=c("EMPFT", "EMPFT2"))
value <- c(9.371,4.444,8.688,9.740,10.433,5.394,7.906,8.616)
mean <- rep(c(8.061,8.087), each=4)

df <- data.frame(CHAIN, variable, value, mean)

我想创建一个闪避的条形图,每个值都位于相应条形上方。然后我想要一行来显示每个变量的平均值,并在该行的右侧显示值。

ggplot(df, aes(x=variable, y=value, fill=factor(CHAIN))) + 
  geom_bar(stat="identity", position="dodge") + 
  scale_fill_manual(name="Chain", values = c("darkblue", "orange", "green", "red"), breaks=c(1,2,3,4), labels=c("Chain 1", "Chain 2", "Chain 3", "Chain 4")) + 
  geom_text(aes(label=value), position=position_dodge(width=0.9), vjust=-0.25) + 
  geom_errorbar(data=df, aes(y=mean, ymax=mean, ymin=mean), size=0.75, linetype="dashed") + 
  geom_text(aes(y = mean, label=mean), position=position_dodge(width=0.9)) + 
  ggtitle("Chain vs EMPFT") + 
  theme(legend.title = element_text(color="black", size=16, face="bold")) + 
  theme(legend.text = element_text(color="black", size=12)) + 
  xlab("") + ylab("Value")

产生以下内容:http://i.imgur.com/qfkQGp5.png

有没有办法将值 8.061 和 8.087 放在相应行的右侧?

为澄清而编辑:user1362215 与我正在寻找的内容很接近。理想情况下,值 8.061 将位于 EMPFT 链 1 柱的左侧,而 8.087 将位于 EMPFT2 链 4 柱的右侧,并且在其他柱上没有重复。

【问题讨论】:

    标签: r plot ggplot2 bar-chart


    【解决方案1】:

    您可能希望以不同的方式对此进行可视化,但您需要做的就是在美学中添加一个 hjust 变量。我建议垂直偏移。

    无论如何,我只是将hjust = c(1.6,rep(0.5,6),-0.65) 添加到打印值的geom_text()

    ggplot(df, aes(x=variable, y=value, fill=factor(CHAIN))) + 
      geom_bar(stat="identity", position="dodge") + 
      scale_fill_manual(name="Chain", values = c("darkblue", "orange", "green", "red"), breaks=c(1,2,3,4), labels=c("Chain 1", "Chain 2", "Chain 3", "Chain 4")) + 
      geom_text(aes(label=value), position=position_dodge(width=0.9), vjust=-0.25) + 
      geom_errorbar(data=df, aes(y=mean, ymax=mean, ymin=mean), size=0.75, linetype="dashed") + 
      geom_text(aes(y = mean, label=mean,hjust = c(1.6,rep(0.5,6),-0.65)), position=position_dodge(width=0.9)) + 
      ggtitle("Chain vs EMPFT") + 
      theme(legend.title = element_text(color="black", size=16, face="bold")) + 
      theme(legend.text = element_text(color="black", size=12)) + 
      xlab("") + ylab("Value")
    

    这就是它的样子。您可能需要调整一些其他美学参数以使其看起来更好。另外,我假设您想要左边的 8.061,否则它会与另一个值重叠。

    【讨论】:

    • 谢谢,理想情况下左右只有一个值。比如 8.061 位于 Chain 1 的左侧,8.087 位于 Chain 4 的右侧。我无法弄清楚如何在每个变量中获取线,并且只有一个值。
    • 如果您想省略图表不同部分的某些值,您可以使用 alpha 参数和scale_alpha_identity() 使某些图形不可见。
    【解决方案2】:

    我想通了:

    ggplot(df, aes(x=variable, y=value, fill=factor(CHAIN))) + 
      geom_bar(stat="identity", position="dodge") + 
      scale_fill_manual(name="Chain", values = c("darkblue", "orange", "green", "red"), breaks=c(1,2,3,4), labels=c("Chain 1", "Chain 2", "Chain 3", "Chain 4")) + 
      geom_text(aes(y=value, label=value, ymax=value), position=position_dodge(width=0.9), vjust=-0.25) + 
      geom_errorbar(data=df, aes(y=mean, ymax=mean, ymin=mean), size=0.75, linetype="dashed") + 
      geom_text(data=df[c(1,8),], aes(y=mean, label=mean, hjust = c(4.15,-3.15))) + 
      ggtitle("Chain vs EMPFT") + 
      theme(legend.title = element_text(color="black", size=16, face="bold")) + 
      theme(legend.text = element_text(color="black", size=12)) + 
      xlab("") + ylab("Value") 
    

    其中给出:http://i.imgur.com/QcNnKd2.png(抱歉,我还不能直接链接图片)

    指定数据后,随便玩玩hjust就好了。

    【讨论】:

      猜你喜欢
      • 2019-08-30
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多