我正在绘制堆积条形图并使用geom_text
插入每个堆栈的值。我面临的困难是一些堆栈非常小/窄,因此两个堆栈的文本相互重叠,因此不是很可读。我想以一种方式调整文本定位,例如文本位置在每个堆栈的hjust == 1
和hjust == -1
之间交替,这样就不会有任何重叠(或任何其他方法会导致可读的文字)。
以下是我目前正在做的一个示例(下面提供了dput
mydf
):
library(ggplot2)
ggplot(mydf, aes(x=variable, y = value, fill = Category)) +
geom_bar(stat="identity") +
geom_text(aes(label = value, y = pos-(value/2)), size = 3)
到目前为止我尝试的是:
使用position = position_dodge(width = 0.5)
和position = position_jitter(h =0.5, w = 0.5)
但没有导致我尝试做的事情。
我的第一个想法是定义hjust = c(1,-1)
希望它会被回收,文本会在hjust == 1
和hjust == -1
之间切换,但会产生错误消息:
Error: Incompatible lengths for set aesthetics: size, hjust
我也尝试过定义size = c(3,3,3,3,3,3,3,3,3), hjust = c(1,-1,1,-1,1,-1,1,-1,1)
,但这会导致相同的错误消息。
对于如何以正确的方式实现这一点,我将不胜感激(我也对其他建议持开放态度。)
我无法弄清楚为什么dput
不起作用(对我来说也没有),所以这里是可读格式的数据:
Category variable value pos maxpos
1 AX WW 47.8 47.8 184.1
2 AY WW 5.6 53.4 184.1
3 AZ WW 15.8 69.2 184.1
4 BX WW 31.4 100.6 184.1
5 BY WW 11.7 112.3 184.1
6 BZ WW 10.7 123.0 184.1
7 CX WW 2.2 125.2 184.1
8 CY WW 21.4 146.6 184.1
9 CZ WW 37.5 184.1 184.1
10 AX SM 39.8 39.8 148.6
11 AY SM 2.9 42.7 148.6
12 AZ SM 13.2 55.9 148.6
13 BX SM 22.7 78.6 148.6
14 BY SM 7.3 85.9 148.6
15 BZ SM 8.9 94.8 148.6
16 CX SM 1.6 96.4 148.6
17 CY SM 17.3 113.7 148.6
18 CZ SM 34.9 148.6 148.6
19 AX AsIs 156.9 156.9 519.0
20 AY AsIs 13.1 170.0 519.0
21 AZ AsIs 70.5 240.5 519.0
22 BX AsIs 72.6 313.1 519.0
23 BY AsIs 30.7 343.8 519.0
24 BZ AsIs 35.6 379.4 519.0
25 CX AsIs 5.2 384.6 519.0
26 CY AsIs 44.8 429.4 519.0
27 CZ AsIs 89.6 519.0 519.0
答案 0 :(得分:11)
通过创建hjust
变量,您可以获得所需的结果。代码:
mydf$hj <- rep(c(1,0,-1), length.out=27)
ggplot(mydf, aes(x=variable, y=value, fill=Category)) +
geom_bar(stat="identity") +
geom_text(aes(label=value, y=pos-(value/2), hjust=hj), size=4)
给出:
@konvas提出的稍微替代解决方案:
ggplot(mydf, aes(x=variable, y=value, fill=Category)) +
geom_bar(stat="identity") +
geom_text(aes(label=value, y=pos-(value/2), hjust=rep(c(1,0,-1), length.out=length(value))), size=4)