我有一个来自ggplot2
的对象,比如myPlot
,我该如何识别x和y轴的范围?
它似乎不是数据值范围的简单倍数,因为可以重新缩放绘图,修改轴的范围等等。 findFn
(来自sos
)和Google似乎没有提出相关结果,除了如何设置轴的范围。
答案 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)
使用
获取yrangeggplot_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)
这不是一个完美的解决方案,但它是一个非常简单快速的解决方法,希望它有所帮助!