使用hjust替换geom_text位置

tal*_*lat 9 r ggplot2 geom-text

我正在绘制一个堆积条形图并用于geom_text插入每个堆栈的值.我面临的困难是一些堆栈非常小/窄,因此两个堆栈的文本相互重叠,因此不是很可读.我想以一种方式调整文本定位,例如文本位置在每个堆栈之间hjust == 1hjust == -1每个堆栈之间交替,以便不会有重叠(或任何其他方法将导致可读文本).

下面是目前我在做什么的例子(dputmydf提供如下):

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) 
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试的是:

使用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
Run Code Online (Sandbox Code Playgroud)

我也尝试过定义,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
Run Code Online (Sandbox Code Playgroud)

Jaa*_*aap 12

通过创建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)
Run Code Online (Sandbox Code Playgroud)

这使: 在此输入图像描述


@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)
Run Code Online (Sandbox Code Playgroud)

  • 或者避免显式创建新变量,并在原始调用中添加`hjust = rep(c(-1,1),length.out = length(value))`(在`aes`内). (4认同)