在facet_wrap中设置x/y限制,其中scale ='free'

dan*_*dan 8 plot r ggplot2 facet-wrap

我已经看到了类似的问题,以及关于在facet_grid中ggplot 设置x/y lim添加功能的讨论.在我的研究中,我经常想要制作几个面板图,比如针对不同的模拟试验,其中轴限制保持不变以突出试验之间的差异.在演示文稿中显示绘图面板时,这尤其有用.在我生成的每个面板图中,各个图需要独立的y轴,因为它们通常是天气变量,温度,相对湿度,风速等.

    ggplot() + ... + facet_wrap(~ ..., scales = 'free_y')
Run Code Online (Sandbox Code Playgroud)

因为我可以轻松制作不同天气变量的情节面板,效果很好. 示例天气变量绘图面板当我在不同的绘图面板之间进行比较时,它具有一致的轴非常好.不幸的是,ggplot没有办法在面板图中设置每个图的个别限制.它默认使用给定数据的范围.上面链接的谷歌小组讨论讨论了这个缺点,但我无法找到有关是否可以添加此更新的任何更新.有没有办法欺骗ggplot设置个别限制?

dan*_*dan 7

有点回避我正在寻找的解决方案的第一个建议是将我的所有数据合并到一个数据表中,并在我的变量和模拟上使用facet_grid

    ggplot() + ... + facet_grid(variable~simulation, scales = 'free_y')
Run Code Online (Sandbox Code Playgroud)

这会生成一个精美的图表,在一个图中显示数据,但在考虑许多模拟时会变得难以处理. facet_grid解决方案

为了"破解"绘制生产我想要的东西,我首先确定了每个天气变量所需的限制.通过查看所有感兴趣的模拟的最大范围,可以找到这些限制.确定后,我创建了一个小数据表,其列与我的模拟数据相同,并将其附加到最后.我的模拟数据有结构

    'year' 'month' 'variable' 'run' 'mean'
     1973     1     'rhmax'     1    65.44
     1973     2     'rhmax'     1    67.44
     ...     ...      ...      ...    ...
     2011    12    'windmin'   200    0.4 
Run Code Online (Sandbox Code Playgroud)

所以我创建了一个具有相同列的新数据表

    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))
Run Code Online (Sandbox Code Playgroud)

这使

    '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
Run Code Online (Sandbox Code Playgroud)

虽然年份跑步的选择是aribtrary,但月份的选择需要在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')
Run Code Online (Sandbox Code Playgroud)

当我用y限制绘制这些数据时,我将x轴值限制为原始数据中的值.带有y限制的附加数据表具有值13.由于ggplot仍然将轴缩放到整个数据集,即使轴受到限制,这也给出了我想要的y限制.需要注意的是,如果数据值大于您指定的限制,则无效.

之前:注意面板之间每个天气变量的y限制的差异.

在sims之前 在sims covars之前

之后:现在,对于面板之间的每个天气变量,y限制保持一致. 在此输入图像描述

在此输入图像描述

我希望在未来几天编辑这篇文章并添加一个可重现的例子以便更好地解释.如果您已经听说过有关向ggplot添加此功能的任何信息,请发表评论.