2016-04-21 57 views
3

是否可以将y轴添加到facet wrap,但仅限于第一行,如截图所示?ggplot2 facet wrap:y轴缩放仅在第一行

代码为我的情节:

library(ggplot2) 

mydf <- read.csv('https://dl.dropboxusercontent.com/s/j3s5sov98q9yvcv/BPdf_by_NB') 

ggplot(data = mydf) + 
    geom_line(aes(x = YEARMONTH, y = NEWCONS, group = 1), color="darkseagreen3") + 
    geom_line(aes(x = YEARMONTH, y = DEMOLITIONS, group = 1), color = "black") + 
    theme_minimal() + 
    labs(title="New constructions Vs Demolitions (2010 - 2014)\n") + 
    theme(axis.line = element_blank(), 
     axis.title.x = element_blank(), 
     axis.title.y = element_blank(), 
     axis.text.x = element_blank(), 
     axis.text.y = element_blank()) + 
    facet_wrap(~ NB) 

结果:

ggplot2 facet wrap

(我手动添加一个传奇了,我希望把规模的地方)

回答

4

这个想法是从this的答案。

p <- ggplot(data = mydf) + 
    geom_line(aes(x = YEARMONTH, y = NEWCONS, group = 1), color="darkseagreen3") + 
    geom_line(aes(x = YEARMONTH, y = DEMOLITIONS, group = 1), color = "black") + 
    theme_minimal() + 
    labs(title="New constructions Vs Demolitions (2010 - 2014)\n") + 
    theme(axis.line = element_blank(), 
       axis.title.x = element_blank(), 
       axis.text.x = element_blank()) + 
    facet_wrap(~ NB) 

注意的变化在theme调用,这样我们就可以选择性以后删除一些grobs。

library(gtable) 
p_tab <- ggplotGrob(p) 
print(p_tab) 

因此,我们要删除除左侧四个项目以外的所有项目。有使用正则表达式一个gtable_filter功能,但它是简单到只写我自己的函数,它简单的负子集(因为我无法手艺正确的正则表达式):

gtable_filter_remove <- function (x, name, trim = TRUE){ 
    matches <- !(x$layout$name %in% name) 
    x$layout <- x$layout[matches, , drop = FALSE] 
    x$grobs <- x$grobs[matches] 
    if (trim) 
     x <- gtable_trim(x) 
    x 
} 

p_filtered <- gtable_filter_remove(p_tab,name = paste0("axis_l-",5:16),trim=FALSE) 

library(grid) 
grid.newpage() 
grid.draw(p_filtered) 

enter image description here

+0

快到了!现在有一个我不需要的Y轴标签(“NEWCONS”)。以防万一,是否可以避免标签,同时保持规模? – HAVB

+0

@HAVB哦,我认为我太过于激进,无法从原来的“主题”调用中删除它。我想如果你把它放回去,它会没事的。 – joran

+0

@HAVB ...我的意思是,把'axis.title.y = element_blank()'放回去,或者在'labs()'中只是'y = NULL'。 – joran