r将文本添加到躲闪的条形图中

时间:2015-04-21 03:56:24

标签: r plot ggplot2 bar-chart

这是数据的一部分:

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的Chain 1栏的左侧,而8.087将位于EMPFT2的Chain 4栏的右侧,而不会重复其他栏。

2 个答案:

答案 0 :(得分: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,因为它会与另一个值重叠。

enter image description here

答案 1 :(得分:0)

我明白了:

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。