【问题标题】:set x/y limits in facet_wrap with scales = 'free'使用 scales = 'free' 在 facet_wrap 中设置 x/y 限制
【发布时间】:2015-04-13 22:45:27
【问题描述】:

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

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

效果很好,因为我可以轻松制作不同天气变量的绘图面板。 当我比较不同的绘图面板时,有一致的轴很好。不幸的是 ggplot 无法在面板图中设置每个图的单独限制。它默认使用给定数据的范围。上面链接的 Google Group 讨论讨论了这个缺点,但我找不到任何关于是否可以添加的更新。有没有办法欺骗 ggplot 来设置个人限制?

【问题讨论】:

    标签: r plot ggplot2 facet-wrap


    【解决方案1】:

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

    虽然 yearrun 的选择是任意的,但 month 的选择必须是 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 限制的附加数据表的 month 值为 13。由于 ggplot 仍将轴缩放到整个数据集,即使轴受到限制,这也给了我想要的 y 限制。需要注意的是,如果数据值大于您指定的限制,这将不起作用。

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

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

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

    【讨论】:

    • 我相信如果您要显示趋势线或某种统计数据,您会想要使用 scale_x_discrete(llmits=...)。 xlim 是 coord_cartesian 的缩写,它本质上只是一个缩放,所以 ggplot 也会用附加的数据计算一个统计数据。也许有人可以确认。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2016-04-18
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多