如何为ggplot2对象提取绘图轴的范围?

时间:2011-10-09 17:50:40

标签: r ggplot2

我有一个来自ggplot2的对象,比如myPlot,我该如何识别x和y轴的范围?

它似乎不是数据值范围的简单倍数,因为可以重新缩放绘图,修改轴的范围等等。 findFn(来自sos)和Google似乎没有提出相关结果,除了如何设置轴的范围。

8 个答案:

答案 0 :(得分:34)

在较新版本的ggplot2中,您可以在ggplot_build(p)的输出中找到此信息,其中p是您的ggplot对象。

对于旧版本的ggplot(< 0.8.9),以下解决方案有效:

在Hadley发布新版本之前,这可能会有所帮助。如果未在绘图中设置限制,则ggplot对象中将不会显示任何信息。但是,在这种情况下,您可以使用ggplot2的默认值并从数据中获取xlim和ylim。

> ggobj = ggplot(aes(x = speed, y = dist), data = cars) + geom_line()
> ggobj$coordinates$limits

$x
NULL

$y
NULL

设置限制后,它们将在对象中可用:

> bla = ggobj + coord_cartesian(xlim = c(5,10))
> bla$coordinates$limits
$x
[1]  5 10

$y
NULL

答案 1 :(得分:24)

I am using D/hints: Value of hints, GameActivity onClick(): false version 2, I am not sure if this is same is previous version, Suppose you have saved your plot on ggplot2 object. It is easy to extract the ranges,

plt

In case of facet plot, you can access scales of individual facets using # y-range layer_scales(plt)$y$range$range # x-range layer_scales(plt)$x$range$range . For example to access the facet at first row and second column,

layer_scales(plot, row_idx, col_idx)

答案 2 :(得分:19)

使用

获取yrange
ggplot_build(myPlot)$panel$ranges[[1]]$y.range 

和xrange with

ggplot_build(myPlot)$panel$ranges[[1]]$x.range

答案 3 :(得分:16)

版本2.2.0 中,必须按照以下步骤操作:

# y-range
ggplot_build(plot.object)$layout$panel_ranges[[1]]$y.range
# x-range
ggplot_build(plot.object)$layout$panel_ranges[[1]]$x.range

答案 4 :(得分:14)

2018年11月UPDATE

timestamp 版本3.1.0 起,以下内容有效:

histogram

便利功能:

ggplot2

直到下一次更新......

答案 5 :(得分:7)

自2018年8月起,您将使用以下内容提取x和y轴范围。

ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range

答案 6 :(得分:2)

如此处所述:https://gist.github.com/tomhopper/9076152#gistcomment-2624958这两个选项之间是有区别的:

#get ranges of the data
ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range 
ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range

#get ranges of the plot axis
ggplot_build(obj)$layout$panel_params[[1]]$x.range
ggplot_build(obj)$layout$panel_params[[1]]$y.range

这是一组便利功能,用于绘制图表列表,提取公共y轴范围并进行替换。我之所以需要它,是因为我在通过ggarange排列的一个图中使用了不同的数据集:

require(ggplot2)
#get the visible scales from single plots
get_plot_view_ylimits <- function(plot) {
  gb = ggplot_build(plot)
  ymin = gb$layout$panel_params[[1]]$y.range[1]
  ymax = gb$layout$panel_params[[1]]$y.range[2]
  message(paste("limits are:",ymin,ymax))
  list(ymin = ymin, ymax = ymax)
}

#change the limit of single plot, using list of limits
change_plot_ylimits <- function(plot, nlimits){
  p <- plot + ggplot2:::limits(unlist(nlimits, use.names =FALSE),"y")
}

#adjust the scales of multiple plots
#take a list of plots, passes back adjusted list of plots
adjust_plots_shared_ylimits <- function(plotList) {
  #read limits
  first <- TRUE
  for (plot in plotList) {
    if (first) {
      nlimits <- get_plot_view_ylimits(plot)
      first <- FALSE
    } else {
      altLimits <- get_plot_view_ylimits(plot)
      nlimits$ymin <- min(nlimits$ymin,altLimits$ymin)
      nlimits$ymax <- max(nlimits$ymax,altLimits$ymax)
    }
  }
  message(paste("new limits are:",nlimits$ymin,nlimits$ymax))
  #adjust limits
  lapply(plotList,change_plot_ylimits,nlimits)
}

我认为这对其他人也可能有用。

答案 7 :(得分:0)

这对您来说是一个潜在的解决方法!除非您更改绘图布局中的轴限制,否则此方法有效。它本质上是从绘图中的数据中获取范围,因此通过过滤数据而不是使用布局函数更改轴时效果更好。

这是代码!

# load ggplot2
library(ggplot2)

# A basic scatterplot
p <-ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, color=Species)) + 
      geom_point(size=6)

# p$data returns the dataset used to create the plot (iris)
head(p$data)

# Choose plot variable you want range for 
range(p$data[,"Sepal.Length"]) # * c(0.95, 1.05)

这不是一个完美的解决方案,但它是一个非常简单快速的解决方法,希望它有所帮助!