第一个建议有点回避我正在寻找的解决方案是将我的所有数据合并到一个数据表中,并在我的变量和模拟上使用facet_grid
ggplot() + ... + facet_grid(variable~simulation, scales = 'free_y')
这会生成一个外观精美的图,将数据显示在一个图中,但在考虑许多模拟时可能会变得笨拙。
为了“破解”绘图以产生我想要的东西,我首先确定了每个天气变量所需的限制。这些限制是通过查看所有感兴趣的模拟的最大范围来发现的。一旦确定,我创建了一个与我的模拟数据具有相同列的小型数据表,并将其附加到末尾。我的模拟数据具有结构
'year' 'month' 'variable' 'run' 'mean'
1973 1 'rhmax' 1 65.44
1973 2 'rhmax' 1 67.44
... ... ... ... ...
2011 12 'windmin' 200 0.4
所以我创建了一个具有相同列的新数据表
ylims.sims <- data.table(year = 1, month = 13,
variable = rep(c('rhmax','rhmin','sradmean','tmax','tmin','windmax','windmin'), each = 2),
run = 201, mean = c(20, 100, 0, 80, 100, 350, 25, 40, 12, 32, 0, 8, 0, 2))
这使
'year' 'month' 'variable' 'run' 'mean'
1 13 'rhmax' 201 20
1 13 'rhmax' 201 100
1 13 'rhmin' 201 0
1 13 'rhmin' 201 80
1 13 'sradmean' 201 100
1 13 'sradmean' 201 350
1 13 'tmax' 201 25
1 13 'tmax' 201 40
1 13 'tmin' 201 12
1 13 'tmin' 201 32
1 13 'windmax' 201 0
1 13 'windmax' 201 8
1 13 'windmin' 201 0
1 13 'windmin' 201 2
虽然年份和运行的选择是任意的,但月份的选择必须是 1:12 之外的任何值。然后我将其附加到我的模拟数据中
sim1data.ylims <- rbind(sim1data, ylims)
ggplot() + geom_boxplot(data = sim1data.ylims, aes(x = factor(month), y = mean)) +
facet_wrap(~variable, scale = 'free_y') + xlab('month') +
xlim('1','2','3','4','5','6','7','8','9','10','11','12')
当我用 y 限制绘制这些数据时,我将 x 轴值限制为原始数据中的值。带有 y 限制的附加数据表的月份值为 13。由于 ggplot 仍将轴缩放到整个数据集,即使轴受到限制,这也给了我想要的 y 限制。需要注意的是,如果数据值大于您指定的限制,这将不起作用。
之前:注意面板之间每个天气变量的 y 限制差异。

之后:现在,对于面板之间的每个天气变量,y 限制保持一致。

我希望在未来几天编辑这篇文章,并添加一个可重现的示例以获得更好的解释。如果您听说过任何有关将此功能添加到ggplot的信息,请发表评论。