我建议您可以先将所有数据合并到一个数据表中,然后使用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添加此功能,请发表评论。