【问题标题】:Calculate axis tick locations based on data in faceted plot根据多面图中的数据计算轴刻度位置
【发布时间】:2021-02-21 12:53:43
【问题描述】:

我有一个问题,我想在facet_grid() 疯狂的大图中计算 y 轴标签的位置。让我告诉你我使用mpg 数据集的意思。

require(tidyverse)

ggplot(mpg, aes(x = displ)) +
  geom_point(aes(y = hwy)) +
  facet_grid(drv ~ class, scales = "free")

您会注意到两个轴都使用可变数量的标签。忽略 x 轴的问题,我有兴趣在 y 轴上仅标记三个值:0、最大值的一半和最大值。这在我的用例中是有意义的,所以这是我尝试过的。

ggplot(mpg, aes(x = displ)) +
  geom_point(aes(y = hwy)) +
  facet_grid(drv ~ class, scales = "free") +
  geom_blank(aes(y = 0)) +                                 # extends y-axis to 0
  scale_y_continuous(expand = expansion(mult = c(0, 0.1)), # prevents ggplot2 from extending beyond y = 0
                     n.breaks = 3)                         # Three axis labels, please.

绘图正确地从 y = 0 开始并正确标记它。但是,剩余的标签分配不当,出于某种原因,标签为n = 2n = 4 而不是n = 3

如果我只能直接计算标签位置!

ggplot(mpg, aes(x = displ)) +
  geom_point(aes(y = hwy)) +
  facet_grid(drv ~ class, scales = "free") +
  geom_blank(aes(y = 0)) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.1)),
                     n.breaks = 3,
                     breaks = c(0, 0.5*max(hwy), 1*max(hwy))) # Maybe these formulas works?
Error in check_breaks_labels(breaks, labels) : object 'hwy' not found

我相信通过这种方式提供断点应该可行,但我的语法不好。我如何访问和使用绘图背后的数据?或者,如果这不起作用,我可以为每行面板手动指定 y 轴标签吗?

我真的可以在这里得到一些帮助。

【问题讨论】:

    标签: r ggplot2 facet-grid


    【解决方案1】:

    如果您想要自定义中断规则,最简单的方法是使用给定(面板)限制的函数来实现这些规则。

    以下是标记 0、最大值和半最大值的示例。

    library(ggplot2)
    
    ggplot(mpg, aes(x = displ)) +
      geom_point(aes(y = hwy)) +
      facet_grid(drv ~ class, scales = "free") +
      scale_y_continuous(expand = expansion(mult = c(0, 0.1)),
                         limits = c(0, NA), # <- fixed min, flexible max. replaces geom_blank
                         breaks = function(x){c(x[1], mean(x), x[2])})
    

    【讨论】:

    • 很好的解决方案 teunbrand。问题是第一行的最大值和第二行的最小值重叠。您是否找到克服这种重叠的解决方案?
    • 您可以使用theme(panel.spacing.y = unit(10, "pt")) 将面板放置得更远。
    • 这是一个很好的建议,但它似乎适用于 x 轴最大值而不是数据最大值。我通过将值调整为 1.1 的扩展来解决它:breaks = function(x){c(x[1]/1.1, mean(x)/1.1, x[2]/1.1)})。这会将标签正确地定位在最大值的一半和最大值处,与 expand() 结合还可以避免与下一个面板重叠。
    【解决方案2】:

    你可以删除scales free:那你得到你想要的了吗?

    require(tidyverse)
    
    ggplot(mpg, aes(x = displ)) +
      geom_point(aes(y = hwy)) +
      facet_grid(drv ~ class)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      相关资源
      最近更新 更多