r - ggplot2:使用不同的y轴刻度调整facet_wrap()中的geom_text()位置

标签 r ggplot2 geom-text

我得到了这个情节

enter image description here

使用此脚本

ggplot(df, aes(x=site_id, y=value)) + 
  geom_bar(stat ="identity", width = 0.8, fill = "lightgreen")+
  facet_wrap(~var,  scales ="free_y")+
  theme_bw()+
  labs(x= " ")+
  theme(axis.text.x=element_text(angle=45, vjust=1, hjust=1,size = 8))

以及下面的数据df

我希望将这些值放置在最高站点(site5 和 site6)的栏内以及其他站点的栏的顶部。我设法对一个变量执行此操作,如下所示

ggplot(df[df$var=="A", ], aes(x=site_id, y=value)) + 
  geom_bar(stat ="identity", width = 0.8, fill = "lightgreen")+
  facet_wrap(~var,  scales ="free_y")+
  geom_text(aes(label=round(value,  digits = 1),
                vjust=0.3, 
                hjust=ifelse(value>5, 1.3,-0.3),
                angle = 90), 
            size=3,
            color="black"
            )+
  theme_bw()+
  labs(x= " ")+
  theme(axis.text.x=element_text(angle=45, vjust=1, hjust=1,size = 8)) 

enter image description here

我可以对所有变量(一次一个)执行相同的操作,然后合并所有图。然而,这很耗时,尤其是当我有很多变量时。我想知道是否有任何直接的方法可以在 y 轴具有不同比例的 facet_wrap() 中做到这一点。任何建议都将受到高度赞赏。

数据

df <- read.table(text =c("
site_id var value
site1   A   0.177764513
site1   D   7.830275133
site1   B   0.248247923
site1   E   12.56416097
site1   C   0.751543862
site1   F   671.0885718
site2   A   0.967731591
site2   D   57.89824801
site2   B   1.304393848
site2   E   66.67904785
site2   C   4.993486213
site2   F   7078.505853
site3   A   0.919473968
site3   D   77.01265019
site3   B   1.144594697
site3   E   90.94579823
site3   C   2.369818009
site3   F   993.2029832
site4   A   2.033933861
site4   D   69.3294669
site4   B   2.749690832
site4   E   109.264453
site4   C   10.76299681
site4   F   8490.393252
site5   A   8.389513302
site5   D   271.7607716
site5   B   10.79398426
site5   E   403.8976818
site5   C   41.75038226
site5   F   34569.96598
site6   A   17.77809543
site6   D   638.3953947
site6   B   22.11052259
site6   E   876.9638354
site6   C   80.14343933
site6   F   77342.83885"), header =T)

最佳答案

您可以通过在两个单独的 geom_text 调用中对数据进行子集化来实现您想要的效果:

library(dplyr)

n <- 2
ggplot(df, aes(x=site_id, y=value)) + 
  geom_col(width = 0.8, fill = "lightgreen")+
  geom_text(data = df %>% group_by(var) %>% top_n(n, value),
            aes(label = round(value,  digits = 1)),
            vjust = 0.3,
            hjust =  1.3,
            angle = 90, 
            size = 3,
            color = "black") +
  geom_text(data = df %>% 
              group_by(var) %>% 
              top_n(nlevels(.$site_id) - n, -value),
            aes(label = round(value,  digits = 1)),
            vjust = 0.3, 
            hjust =  -0.3,
            angle = 90, 
            size = 3,
            color = "black") + 
  facet_wrap(~var, scales = "free_y") +
  theme_bw() +
  labs(x = "") +
  theme(axis.text.x = element_text(angle = 45, 
                                   vjust = 1, 
                                   hjust = 1,
                                   size = 8))

enter image description here

关于r - ggplot2:使用不同的y轴刻度调整facet_wrap()中的geom_text()位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43577569/

相关文章:

python - 多处理和 rpy2(使用 ape)

r - 如何在ggplot2中用不同因素绘制一维点的密度

r - 在 grid.text 中使用 pch 字符

r - 将文本大小映射到 ggplot 中的数据的策略

r - 如何改变 R ggplot 中 geom_text 中文本的长度?

arrays - 多维数组操作 R

r - 使用facet_wrap()时颜色错误

r - 为什么在data.table中使用 "character is often preferred to factor"作为 key ?

r - 如何在ggplot中绘制多条线段

r - ggplot2 图中 webdings 符号的图例符号