【问题标题】:automatically adjust axis limits while plotting separate plots together在将单独的图绘制在一起时自动调整轴限制
【发布时间】:2018-03-28 02:24:12
【问题描述】:

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

在手动检查上述绘图后调整 y 轴范围,发现 plotUng 的范围比 plotG 的范围更广。因此,将 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)

上面的情节符合预期。有没有办法在没有手动检查的情况下自动执行此操作(仅使用绘图对象),因为并非总是可以手动检查所有绘图并相应地调整轴限制?

【问题讨论】:

  • 你能得到地址吗?我也在寻找类似的方法来做到这一点。我希望仅针对某些图形(例如,值大于 100)扩展 y 轴,但其余图形的最大 y 轴为 75。
  • @ScottR 不,我还没有找到自动化的方法。如果您找到更好的方法,请与我分享。谢谢!
  • 我继续并发布了我的问题。它和你的不太一样,但希望能提供一些灵感。 stackoverflow.com/questions/66335729/…

标签: r ggplot2 gridextra yaxis


【解决方案1】:

您对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)

由于找到几列的极值很简单,这是我发现的最“自动化”的方法。

请注意,坐标问题仅发生在ggplot 中的 y-limits

【讨论】:

  • 感谢另一种确定 y 轴限制并根据新限制调整图的方法。我要求提供自动方法的存在会满足需要的建议。我的意思是只有绘图对象才能通过调整限制自动完成排列。
  • 对不起,我不太明白; “自动”是什么意思?
  • 抱歉回复晚了。我的意思是在生成图后不计算lim_y。而是输入:一组图(多于1个);输出:调整限制的输入图的排列。这里的代码会随着输入的变化而变化。我在问是否有任何方法可以使输出仅在输入更改时才更改。希望现在很清楚。
  • 我不明白,因为lim_y 是在生成图之前计算的。因此,从我上面给出的内容来看,自动化解决方案很简单:对于任何输入,您计算最大值和最小值,然后调整限制。您只需使用上面的示例创建一个函数来执行此操作。是更清楚还是你想让我澄清一下?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多