我想在并排绘制时自动调整 ggplot 图。
library(ggplot2)
library(gridExtra)
set.seed(123)
freq <- sample(1:10, 7, replace = T)
labels <- c('AUS', 'NZ', 'ENG', 'SOC', 'PAK', 'SRI', 'IND')
value <- paste("i",1:10,sep='')
lab <- rep(unlist(lapply(1:length(freq), function(x) rep(labels[x],freq[x]))),2)
ival <- rep(unlist(lapply(1:length(freq), function(x) value[1:freq[x]])),2)
df <- data.frame(lab, ival, type=c(rep('Type1',42),rep('Type2',42)),val=runif(84,0,1))
绘制使用上述随机过程生成的数据。
plotUng <- ggplot(df, aes(x=ival, y=val, col = type, group = type)) +
geom_line() +
geom_point(aes(x=ival, y=val)) +
facet_wrap( ~lab, ncol=3) +
theme(axis.text.x=element_text(angle=45, vjust=0.3)) +
scale_x_discrete(limits=paste('i',1:10,sep=''))
现在lab
根据某些条件对数据进行分组。现在我想根据分组数据生成新图。
dfGrp <- df %>% mutate(lab = recode(lab, 'AUS' = 'A', 'NZ' = 'A', 'ENG' = 'A',
'SOC' = 'A', 'PAK' = 'B', 'SRI' = 'B')) %>%
group_by(lab, ival, type) %>% mutate(val = mean(val)-0.2) %>% ungroup() %>% distinct()
plotG <- ggplot(dfGrp, aes(x=ival, y=val, col = type, group = type)) +
geom_line() +
geom_point(aes(x=ival, y=val)) +
facet_wrap( ~lab, ncol=3) +
theme(axis.text.x=element_text(angle=45, vjust=0.3)) +
scale_x_discrete(limits=paste('i',1:10,sep=''))
使用 .并排绘制上述两个图以进行比较grid.arrange
。
grid.arrange(plotUng, plotG, ncol=2)
在手动检查上述plotUng的限制比 plotG 更宽的图后调整 y 轴限制。因此,将 plotG 的限制与 plotUng 的限制调整为。coord_cartesian(ylim = ggplot_build(plotUng)$layout$panel_ranges[[1]]$y.range)
grid.arrange(plotUng, plotG + coord_cartesian(ylim = ggplot_build(plotUng)$layout$panel_ranges[[1]]$y.range), ncol=2)
上图符合预期。有没有办法在没有手动检查的情况下自动执行此操作(仅使用绘图对象),因为并非总是可以手动检查所有绘图并相应地调整轴限制?