在使用'scales = "free"'的facet_wrap中设置x/y轴限制。

8

我看到过类似的问题,并且有关在 ggplot 中添加功能的讨论,可以参考 在 facet_grid 中设置 x/y 轴限制。在我的研究中,我经常需要绘制多个面板图,例如不同模拟试验的图形,其中轴限制保持不变以突出试验之间的差异。这在演示中展示面板图时特别有用。在我制作的每个面板图中,各个子图需要独立的 y 轴,因为它们通常是天气变量,如温度、相对湿度、风速等。使用

    ggplot() + ... + facet_wrap(~ ..., scales = 'free_y')

它非常好用,因为我可以轻松地生成不同天气变量的图表面板。 example weather variable plot panel 当我在不同的图表面板之间比较时,保持一致的坐标轴是很好的。不幸的是,ggplot没有提供设置面板中每个图表的单独限制的方法。它默认使用给定数据的范围。上面链接的 Google Group 讨论了这个缺点,但我无法找到是否可以添加这个功能的任何更新。有没有什么办法来欺骗ggplot以设置单独的限制?

1个回答

7

我建议您可以先将所有数据合并到一个数据表中,然后使用facet_grid函数根据您的变量和模拟进行分组呈现。

    ggplot() + ... + facet_grid(variable~simulation, scales = 'free_y')

这将生成一个漂亮的图表,将数据显示在一个图形中,但是在考虑到多个模拟时可能变得笨重。

为了“突破”绘图以产生我想要的效果,我首先确定了我对每个天气变量所需的限制。通过查看所有感兴趣的模拟的最大范围来找到这些限制。一旦确定了限制,我创建了一个与我的模拟数据具有相同列的小数据表,并将其附加到末尾。我的模拟数据结构如下:

facet_grid solution
    '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添加此功能,请发表评论。

我认为如果你要展示趋势线或某种统计数据,你应该使用scale_x_discrete(llmits=...)。xlim是coord_cartesian的缩写,本质上只是一个缩放功能,因此ggplot也会计算附加数据的统计数据。也许有人可以确认一下。 - Dominik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接