获取ggplot中的tick tick位置

时间:2014-12-09 08:31:05

标签: r ggplot2 bar-chart

我创建了一个使用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')

irisplot

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

你能告诉我如何:

  1. 从我的ggplot中获取刻度位置;或
  2. 获取ggplot用于刻度位置的功能,以便我可以使用它来定位我的线。
  3. 所以我可以做类似

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

4 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:2)

查看ggplot2::ggplot_build - 它可以显示有关绘图对象的大量详细信息。你必须给它一个绘图对象作为输入。我通常希望str() ggplot_build的结果来查看它具有的所有不同值。

例如,我看到有一个panel --> ranges --> 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')


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

答案 2 :(得分:0)

对于ggplot 3.1.0,这对我有用:

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

答案 3 :(得分:-2)

肯定可以。阅读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')