2017-10-16 74 views
1

我想在并排绘图时自动调整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) 

enter image description here

调整上述图表,其plotUng具有比plotG更宽范围的人工检查后的y轴的限制。因此,调整plotG的极限,绘制极限为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) 

enter image description here

上述情节按预期方式。是否有任何方法可以自动执行此操作(仅限绘图对象)而无需手动检查,因为手动检查所有绘图并相应地调整轴限制并非总是可行?

回答

0

您对ggplot_build()所做的工作可以自动完成。但对我来说,比较几个图的最简单方法是找到要比较的所有对象的最小值和最大值,然后将这些值作为每个对象的coord_cartesian()。例如这里:

lim_y <- c(min(df$val, dfGrp$val), max(df$val, dfGrp$val)) 

plotUng <- plotUng + coord_cartesian(ylim = lim_y) 
plotG <- plotG + coord_cartesian(ylim = lim_y) 

grid.arrange(plotUng, plotG, ncol=2) 

enter image description here

由于中查找一些列的极值很简单,这是最“自动化”的方式,我发现。

注意,坐标问题仅在ggplot

+0

由于发生用于Y-限制用于识别y轴的限制,并根据新的极限调整图的另一种方法。我正在要求提供有关自动方法的存在是否有必要的建议。我的意思是只有绘图对象才能通过调整极限自动完成。 – Prradep

+0

对不起,但我真的不明白; “自动”是什么意思? –

+0

迟到回复你的道歉。我的意思是在绘图生成后不计算'lim_y'。相反输入:一组图(超过1);输出:安排具有调整极限的输入图。这里代码在输入改变时改变。我询问是否有任何方法只在输入发生变化时才会改变输出。希望现在很清楚。 – Prradep