ggplot2オブジェクトのプロット軸の範囲を抽出するにはどうすればよいですか?


87

ggplot2たとえばのオブジェクトがありますmyPlot。どうすればx軸とy軸の範囲を特定できますか?

プロットを再スケールしたり、軸の範囲を変更したりできるため、データ値の範囲の単純な倍数ではないようです。 findFn(からsos)とGoogleは、軸の範囲を設定する方法を除いて、関連する結果を表示していないようです。


1
は、plotオブジェクト自体から直接抽出できないと確信していますが、データとのデフォルト値から(簡単な場合)推測できますexpand。こちらをご覧ください
joran

1
私はに言及していたexpandの引数scale_*で機能ggplot。たとえば、ここにリストされているデフォルトを参照してください
joran

6
次のバージョンでそれを抽出できるようになります...
ハドリー'10年

1
代わりにアレックス・ホルコムの答えを受け入れてもらえますか?Paul Hiemstraは、3年以上前のggplot2のバージョンにのみ関連します。
Max Ghenis

3
** 2018年8月の時点で、x軸とy軸の範囲を次のように抽出します。** ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range
マイケル

回答:


41

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

34
具体的には、ggplot2の新しいバージョンでは、ggplot_build(ggobj)$ panel $ ranges [[1]] $ y.rangeでyrangeを取得し、ggplot_build(ggobj)$ panel $ ranges [[1]] $でxrangeを取得できます。 x.range
Alex Holcombe

11
以下の場合ggplot2、バージョン2.1.0.9001この使用R:コード ggplot_build(obj)$layout$panel_ranges[[1]]$x.range ggplot_build(obj)$layout$panel_ranges[[1]]$y.range
GegznaV

17
以下のためのggplot2 バージョン2.2.1.9000 と(おそらく)新しい使用このRコード: ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range
GegznaV

3
元のプロット呼び出し内で動的に行う方法はありませんか?
jzadra

4
2.2.1では、layer_scales(ggobj)$ y $ range $ rangeを使用することもできます
Alex Holcombe

40

私はggplot2バージョン2 を使用していますが、これが以前のバージョンと同じかどうかはわかりませんplt。オブジェクトにプロットを保存したとします。範囲を抽出するのは簡単ですが、

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

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

ファセットプロットの場合、を使用して個々のファセットのスケールにアクセスできますlayer_scales(plot, row_idx, col_idx)。たとえば、1行2列のファセットにアクセスするには、

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

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

2
そして、バージョン3.1.0
r_alanb

2
これにより、プロットするデータの範囲が与えられます-スケール拡張を可能にする必要がある軸範囲全体を取得するには、さらに、制限が設定されている場合(ylimまたはを介してcoord_cartesian)、スケール拡張は、ここで指定されたコードによって返される制限ではなく、これらの制限に適用されます。
ヘザーターナー、

22

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

便利な機能:

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)

次のアップデートまで...


1
便利な機能を使用して編集を提案し、必要に応じてロールバックします。;-)
PatrickT 2018年

1
@PatrickTあなたの更新は本当に便利です。本当に感謝しています:)
GegznaV

20

イランジュを手に入れよう

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

とxrange

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

2
これらのソリューションは連続した数値軸に適していますが、日付(連続スケール)またはカテゴリ値を持つ軸をどのように処理できますか?この方法を使用すると、geom_textを使用してテキストを追加するために日付形式への変換が必要な大きな数値が得られます。
Joseph Kreke

軸の制限を設定せず、ggplotがデフォルトで提案するものを使用するとどうなりますか?私のユースケースは、私は、プロット1のデフォルト値のように私は、プロット2は、プロット1と同じ軸の範囲を持つようにしたいということです
NewNameStat

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

8

2018年8月の時点で、x軸とy軸の範囲を次のように抽出します。

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


2

ここで述べたように:https : //gist.github.com/tomhopper/9076152#gistcomment-2624958 2つのオプションには違いがあります:

#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軸範囲を抽出して置き換える便利な関数のセットです。を介して配置された1つのグラフ内で異なるデータセットを使用したため、これが必要でした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)
}

これは他の人にも役立つかもしれないと思いました。


1つの問題があります。おそらく誰かが対処方法を知っています。レポートされた範囲は、リストのプロットのすべての範囲を含めるのに「十分な大きさ」ですが、実際の最大値(たとえば、使用するプロットstat_smooth( method = "lm")
フレデリク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.