9

我正在绘制一个堆积条形图并用于geom_text插入每个堆栈的值。我面临的困难是一些堆栈非常小/窄,因此两个堆栈的文本相互重叠,因此不是很可读。我想以某种方式调整文本位置,例如文本位置在每个堆栈之间交替hjust == 1hjust == -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)and position = position_jitter(h =0.5, w = 0.5)but none 导致了我想要做的事情。

我的第一个想法是定义hjust = c(1,-1)希望它会被回收并且文本会交替出现hjust == 1hjust == -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
4

1 回答 1

14

通过创建一个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)
于 2014-07-08T09:03:24.237 回答