【问题标题】:Get tick break positions in ggplot在ggplot中获取刻度线位置
【发布时间】:2015-02-07 01:51:34
【问题描述】:

我创建了一个使用ggplot 创建条形图的函数。

在我的图中,我想在刻度线的位置用白色水平条覆盖绘图,如下图所示

p <- ggplot(iris, aes(x = Species, y = Sepal.Width)) + 
geom_bar(stat = 'identity')
# By inspection I found the y-tick postions to be c(50,100,150)
p + geom_hline(aes(yintercept = seq(50,150,50)), colour = 'white')

但是,我希望能够更改数据,因此我不能像示例中那样对线条使用静态位置。例如,我可能将上面示例中的Sepal.With 更改为Sepal.Height

你能告诉我怎么做吗:

  1. 从我的 ggplot 中获取刻度位置;或
  2. 获取ggplot 用于刻度位置的函数,以便我可以使用它来定位我的线条。

所以我可以做类似的事情

tickpositions <- ggplot_tickpostion_fun(iris$Sepal.Width)
p + scale_y_continuous(breaks = tickpositions) +
geom_hline(aes(yintercept = tickpositions), colour = 'white')

【问题讨论】:

    标签: r ggplot2 bar-chart


    【解决方案1】:

    对于 ggplot 3.1.0,这对我有用:

    ggplot_build(p)$layout$panel_params[[1]]$y.major_source
    #[1]   0  50 100 150
    

    【讨论】:

    • 在 ggplot2 v3.3.0 中,这对我有用(但这也为我返回向量中的 NA):ggplot_build(p)$layout$panel_params[[1]]$y$breaks
    【解决方案2】:

    (1)的一种可能的解决方案是使用ggplot_build 来获取绘图对象的内容。 ggplot_build 导致“[...] 一个面板对象,其中包含有关 [...] 中断的所有信息”。

    ggplot_build(p)$layout$panel_ranges[[1]]$y.major_source
    # [1]   0  50 100 150
    

    请参阅编辑前ggplot2 2.2.0 替代方案。

    【讨论】:

    • 对于 ggplot 版本 2.2.1.9000,此解决方案似乎不起作用。它返回 NULL
    • 感谢您让我知道@Mikey Harper! ggplot 机器确实在进化。时间允许的时候我去看看。干杯。
    【解决方案3】:

    查看ggplot2::ggplot_build - 它可以向您显示有关绘图对象的许多详细信息。你必须给它一个绘图对象作为输入。我通常喜欢str()ggplot_build 的结果,看看它有哪些不同的值。

    例如,我看到有一个 panel --&gt; ranges --&gt; y.major_source 向量,这似乎是您正在寻找的。所以要完成你的例子:

    p <- ggplot() +
        geom_bar(data = iris, aes(x = Species, y = Sepal.Width), stat = 'identity')
    pb <- ggplot_build(p)
    str(p)
    y.ticks <- pb$panel$ranges[[1]]$y.major_source
    p + geom_hline(aes(yintercept = y.ticks), colour = 'white')
    


    请注意,我将 data 参数从主 ggplot 函数移到 geom_bar 内部,这样 geom_line 就不会尝试使用相同的数据集并在 iris 中的数字时抛出错误不是我们正在绘制的线数的倍数。另一种选择是将data = data.frame() 参数传递给geom_line;我无法评论哪个是更正确的解决方案,或者是否有更好的解决方案。但是我的代码的要点仍然存在:)

    【讨论】:

      【解决方案4】:

      当然可以。阅读 seq() 函数的帮助文件。

      seq(from = min(), to = max(), len = 5)
      

      然后做这样的事情。

      p <- ggplot(iris, aes(x = Species, y = Sepal.Width)) + 
      geom_bar(stat = 'identity')
      p + geom_hline(aes(yintercept = seq(from = min(), to = max(), len = 5)), colour = 'white')
      

      【讨论】:

      • 不幸的是,即使这段代码可以运行,序列也不一定对应 ggplot 网格线的位置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多