我正在绘制一个堆叠的条形图,并使用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
最佳答案
通过创建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)
关于r - 带有替换的geom_text位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24626769/