ggplot2 geom_text水平分组条形图上的位置文本

时间:2018-07-30 12:35:20

标签: r ggplot2 geom-text

嗨,我正在努力将标签放置在正确位置的水平分组图中。我知道以前也有类似的问题,但是我似乎并没有找到答案。

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

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

但是,尽管我调整了参数,但星星永远不会垂直居中+每次到误差线的距离都不同:

enter image description here

在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) )

enter image description here

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

2 个答案:

答案 0 :(得分:3)

在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)

enter image description here

答案 1 :(得分:1)

就像我在上面的评论中提到的那样,我认为这是一个印刷问题:星号字符设置在一个略微的上标中,因此它徘徊在您期望它所在的中心线上方。我没有使用该特定字符,而是尝试使用geom_point来获得比geom_text更多的控制权,然后将重要性变量映射为shape。我略微更改了数据,以使列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-07-30创建。