【问题标题】:Alternate geom_text position with hjust使用 hjust 替换 geom_text 位置
【发布时间】:2014-08-28 21:22:10
【问题描述】:

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

这是我目前正在做的一个例子(下面提供了mydfdput):

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 == 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

【问题讨论】:

  • 由于某种原因我无法加载您的dput
  • @DavidArenburg,我不知道出了什么问题,希望你不介意使用其他格式。
  • 请参阅stackoverflow.com/a/50060510/2270475 以获得另一个简洁的解决方案。

标签: r ggplot2 geom-text


【解决方案1】:

通过创建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)

【讨论】:

  • 谢谢 Jaap,这正是我所需要的 :) +1
  • 或者避免显式创建新变量,并在原始调用中添加hjust = rep(c(-1, 1), length.out = length(value))(在aes 内)。
  • @konvas 感谢您的建议。我更新了我的答案。
  • @Jaap 我知道这是 7 岁,但我有一个完全相同的问题,我无法调整 hj 值来解决问题。介意帮忙吗?
  • @Jaap 特别是我不明白 y 值在 aes() 中的作用,以及为什么您为 hj 选择长度为 3 的向量?非常感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2015-05-04
相关资源
最近更新 更多