ggplot2
たとえばのオブジェクトがありますmyPlot
。どうすればx軸とy軸の範囲を特定できますか?
プロットを再スケールしたり、軸の範囲を変更したりできるため、データ値の範囲の単純な倍数ではないようです。 findFn
(からsos
)とGoogleは、軸の範囲を設定する方法を除いて、関連する結果を表示していないようです。
ggplot2
たとえばのオブジェクトがありますmyPlot
。どうすればx軸とy軸の範囲を特定できますか?
プロットを再スケールしたり、軸の範囲を変更したりできるため、データ値の範囲の単純な倍数ではないようです。 findFn
(からsos
)とGoogleは、軸の範囲を設定する方法を除いて、関連する結果を表示していないようです。
ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range
ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range
回答:
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
ggplot2
、バージョン2.1.0.9001この使用R
:コード ggplot_build(obj)$layout$panel_ranges[[1]]$x.range
ggplot_build(obj)$layout$panel_ranges[[1]]$y.range
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
私は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
ylim
またはを介してcoord_cartesian
)、スケール拡張は、ここで指定されたコードによって返される制限ではなく、これらの制限に適用されます。
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)
次のアップデートまで...
イランジュを手に入れよう
ggplot_build(myPlot)$panel$ranges[[1]]$y.range
とxrange
ggplot_build(myPlot)$panel$ranges[[1]]$x.range
ここで述べたように: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)
}
これは他の人にも役立つかもしれないと思いました。
stat_smooth( method = "lm")
expand
。こちらをご覧ください。