我有一个物体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
Answers:
在较新版本的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)
。例如,要访问第一行和第二列的构面,
# 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)
直到下一次更新...
用得到yrange
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两种选择之间有区别:
#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)
}
我认为这对其他人也可能有用。
stat_smooth( method = "lm")
expand
。看这里。