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

Ite*_*tor 84 r ggplot2

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

它似乎不是数据值范围的简单倍数,因为可以重新缩放绘图,修改轴的范围等等. findFn(从sos)和谷歌似乎并不被调高相关的结果,不是如何设置轴的范围等.

Pau*_*tra 40

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

对于旧版本的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
Run Code Online (Sandbox Code Playgroud)

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

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

$y
NULL
Run Code Online (Sandbox Code Playgroud)

  • 具体来说,在较新版本的ggplot2中,你可以使用ggplot_build(ggobj)$ panel $ ranges [[1]] $ y.range和xrange with ggplot_build(ggobj)$ panel $ ranges [[1]] $获取yrange x.range (33认同)
  • 对于`ggplot2`**版本2.2.1.9000**和(最有可能)更新使用这个`R`代码:`ggplot_build(obj)$ layout $ panel_scales_x [[1]] $ range $ range``ggplot_build(obj)$布局$ panel_scales_y [[1]] $ $范围range` (16认同)
  • 对于`ggplot2`版本2.1.0.9001使用此`R`代码:`ggplot_build(obj)$ layout $ panel_ranges [[1]] $ x.range``ggplot_build(obj)$ layout $ panel_ranges [[1]] $ y .range` (11认同)
  • 在 2.2.1 你也可以使用 layer_scales(ggobj)$y$range$range (4认同)
  • 没有办法在原始绘图调用中动态地执行此操作? (3认同)

The*_*aya 31

我使用的是ggplot2版本2,我不确定这是否与之前的版本相同,假设您已将图表保存在plt对象上.提取范围很容易,

# y-range
layer_scales(plt)$y$range$range

# x-range
layer_scales(plt)$x$range$range
Run Code Online (Sandbox Code Playgroud)

在小平面图的情况下,您可以使用的方法访问各个方面的比例layer_scales(plot, row_idx, col_idx).例如,要访问第一行和第二列的构面,

# y-range
layer_scales(plt, 1, 2)$y$range$range

# x-range
layer_scales(plt, 1, 2)$x$range$range
Run Code Online (Sandbox Code Playgroud)

  • 和**版本3.1.0 ** (2认同)
  • 请注意,这为您提供了要绘制的数据范围 - 要获得完整的轴范围,您需要允许比例扩展。此外,如果已经设置了限制(例如通过`ylim` 或`coord_cartesian`),比例扩展将应用于这些限制,而不是由这里给出的代码返回的那些。 (2认同)

Ale*_*mbe 20

得到yrange

ggplot_build(myPlot)$panel$ranges[[1]]$y.range 
Run Code Online (Sandbox Code Playgroud)

和xrange一起

ggplot_build(myPlot)$panel$ranges[[1]]$x.range
Run Code Online (Sandbox Code Playgroud)

  • 这些解决方案适用于连续的数字轴,但是如何处理带有日期(连续刻度)或分类值的轴呢?当我使用此方法时,我会得到较大的数值,这些数值需要一些转换为日期格式才能使用geom_text添加文本。 (2认同)

pat*_*t-s 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
Run Code Online (Sandbox Code Playgroud)


Geg*_*naV 15

2018年11月更新

ggplot2 3.1.0版开始,以下工作原理:

obj <- qplot(mtcars$disp, bins = 5)

# x range
ggplot_build(obj)$layout$panel_params[[1]]$x.range

# y range
ggplot_build(obj)$layout$panel_params[[1]]$y.range
Run Code Online (Sandbox Code Playgroud)

便利功能:

get_plot_limits <- function(plot) {
    gb = ggplot_build(plot)
    xmin = gb$layout$panel_params[[1]]$x.range[1]
    xmax = gb$layout$panel_params[[1]]$x.range[2]
    ymin = gb$layout$panel_params[[1]]$y.range[1]
    ymax = gb$layout$panel_params[[1]]$y.range[2]
    list(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax)
}
get_plot_limits(p)
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*ael 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


小智 7

如此处所述: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
Run Code Online (Sandbox Code Playgroud)

这是一组方便的函数,用于获取绘图列表,提取公共 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)
}
Run Code Online (Sandbox Code Playgroud)

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