2017-04-23 198 views
2

我得到这个情节GGPLOT2:调整geom_text()在facet_wrap()具有不同的y轴的位置鳞

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下方。

我想将值放在最高站点(站点5和站点6)的栏内和其他站点栏的顶部。我设法做到这一点的一个变量如下

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

我可以为所有变量(每次一个),然后将所有的地块做同样的。但是,这是需要时间的,特别是如果我有很多变数。我想知道是否有任何简单的方法来做到这一点在facet_wrap()与y轴不同的尺度。任何建议将不胜感激。

DATA

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) 

回答

2

你可以达到你想要在两个独立的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

+0

非常感谢您的时间和帮助。 – aelwan