【问题标题】:ggplot2 geom_text position text on horizontal grouped barplotggplot2 geom_text 在水平分组条形图上定位文本
【发布时间】:2019-01-06 17:05:43
【问题描述】:

您好,我正在努力在正确位置的分组水平条形图中获取标签。我知道以前也有类似的问题,但我似乎没有找到工作的答案。

我的数据(“相关性”)如下所示:

Trait r      se      Disease   significant
1     0.4    0.06    A         *
1     0.1    0.06    B
1     -0.05  0.03    C
2     0.4    0.06    A         *
2     0.1    0.05    B
2     -0.06  0.03    C         *
3     0.04   0.06    A         *
3     0.2    0.05    B         *
3     0.3    0.04    C         *

还有我的代码:

grouped_plot <- ggplot(data=Correlation, aes(x=Trait, y=r, 
fill=Disease)) + geom_bar(stat="identity", position="dodge", 
width=0.9)+ geom_errorbar(aes(ymin = r - se, ymax = r + se), 
width = 0.3, position=position_dodge(0.9), stat="identity", 
color=rgb(100,100,100, maxColorValue = 255)) + coord_flip() +
theme_minimal() +       
scale_y_continuous(breaks=seq(-0.8,0.8,by=0.1)) +  
theme(legend.position="none")  + ggtitle("XXX") + theme(plot.title = 
element_text(size=11) )

grouped_plot + geom_text(aes(x=Trait, y=r + 0.07 * sign(r),      
label=format(significant), hjust=ifelse(r>0,0,1)), 
position=position_dodge(0.9), size=5, color=rgb(100,100,100, 
maxColorValue = 255) )

但是无论我调整参数,星星从来没有完全垂直居中+每次到误差条的距离都不一样:

在 geom_text 的 y 参数中添加“se”也不会使星星与误差线的距离相同(对于朝负方向的误差线)

grouped_plot + geom_text(aes(x=Trait, y=r +se + 0.01 * sign(r),      
label=format(significant), hjust=ifelse(r>0,0,1)), 
position=position_dodge(0.9), size=5, color=rgb(100,100,100, maxColorValue  
= 255) )

有人有解决办法吗?我会很感激的

【问题讨论】:

  • 我在搞砸这个时看到的一件事是它似乎部分是印刷的。星号略带上标;将 label 参数更改为 "o" 或 "I" 以查看。我在想可能有一个 unicode 可以用来代替居中的星形
  • 我确实有所作为——谢谢!

标签: r ggplot2 geom-text


【解决方案1】:

在 aes 之外使用 hjust 和一些 angle 的值

 ggplot(data=d, aes(x=Trait, y=r, fill=Disease)) +
  geom_col(position = position_dodge(width = 0.9), show.legend = F)+ 
  geom_errorbar(aes(ymin = r - se, ymax = r + se), 
                width = 0.3, position=position_dodge(width=0.9)) + 
  coord_flip() +
  scale_y_continuous(breaks=seq(-0.8,0.8,by=0.1)) +  
  theme_minimal() +       
  geom_text(aes(x=Trait, y=r + se + 0.01 * sign(r),      
            label=format(significant)), position=position_dodge(width = 0.9),
            angle =270, hjust=.3)

【讨论】:

  • 您好,非常感谢 - 在 aes 之外进行操作就可以了。它仍然不能解决当误差线长度不同时恒星到误差线的距离不同的问题。你知道如何解决这个问题吗?
  • 查看我的编辑。您忘记在 y 调用中包含 se。
  • 谢谢!它确实适用于该图,但我有更多数据,我还想在进入负方向的条形图上包含一个星形(不小心在这里选择了一个示例,但情况并非如此),然后它当然不适用于添加“se”作为星号将再次向 0 移动。
  • 这不是由符号(r)修复的吗?否则,您可以尝试ifelse 更改方向或乘法因子。在您的问题中还包括一个可重复的示例。那我们就来看看
【解决方案2】:

就像我在上面的评论中提到的那样,我认为存在排版问题:星号字符设置在一个轻微的上标中,因此它悬停在您期望它所在的中心线上方。我没有使用那个特定的字符,而是尝试使用geom_point 来获得比geom_text 更多的控制,然后将显着性变量映射到形状。我稍微更改了数据,以创建一个列 is_sig,该列将为每个观察值提供值,因为当有 NA 值时,我无法将事情排成一行(使躲避变得困难)。

我使用的另一个技巧是定位在误差线之外,同时考虑到符号。我设置了一个变量gap 来保持每颗星的偏移量一致,然后在geom_point 中,将y 位置计算为r 加上或减去标准误差+ 间隙。

弄乱使用的形状;这是我能很快得到的最接近你的星号的,但可能有一个你可以输入的 unicode 字符。在我的 Mac 上,我可以很容易地得到一个明星角色,但你需要一个额外的步骤才能让那个 unicode 角色显示在情节中。也请查看shape reference。

在geom_point 中,设置show.legend = F 以防止点出现在图例中。或者省略这个,并创建一个形状图例来显示星号的含义。请注意正在删除那些 NA 形状的警告。

library(dplyr)
library(readr)
library(ggplot2)

# ... reading data

df2 <- df %>%
  mutate(is_sig = ifelse(is.na(significant), "not significant", "significant"))

gap <- 0.01

ggplot(df2, aes(x = as.factor(Trait), y = r, fill = Disease, group = Disease)) +
  geom_col(position = position_dodge(width = 0.9), width = 0.9) +
  geom_errorbar(aes(ymin = r - se, ymax = r + se), position = position_dodge(width = 0.9), width = 0.3) +
  geom_point(aes(shape = is_sig, y = r + sign(r) * (se + gap)), position = position_dodge(width = 0.9), 
             size = 2, show.legend = F) +
  coord_flip() +
  scale_shape_manual(values = c("significant" = 8, "not significant" = NA))
#> Warning: Removed 3 rows containing missing values (geom_point).

由reprex package (v0.2.0) 于 2018 年 7 月 30 日创建。

【讨论】:

  • 感谢您指出星形的问题,然后提供这个完美的解决方案!
猜你喜欢
  • 2012-06-12
  • 2011-08-26
  • 1970-01-01
  • 2014-04-20
  • 2021-10-25
  • 1970-01-01
相关资源
最近更新 更多