r 添加文本到闪避条形图
r add text to dodged barplot
这是部分数据:
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 柱的右侧,并且不会与其他柱重复。
您可能想要以不同的方式形象化,但您需要做的就是向美学添加一个 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,否则它会与另一个值重叠。
我想通了:
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(抱歉,我还不能直接 link 图片)
指定数据后,就是玩hjust了
这是部分数据:
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 柱的右侧,并且不会与其他柱重复。
您可能想要以不同的方式形象化,但您需要做的就是向美学添加一个 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,否则它会与另一个值重叠。
我想通了:
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(抱歉,我还不能直接 link 图片)
指定数据后,就是玩hjust了