ggplot2:如何从绘图对象读取比例变换

ggplot2: how to read the scale transformation from a plot object

我正在尝试提取有关现有 ggplot 对象的限制和转换的信息。我快到了,但需要一些帮助。这是我的代码

data = data.frame(x=c(1,10,100),y=(c(1,10,100)))
p    = ggplot(data=data,aes(x=x,y=y)) + geom_point()
p    = p + scale_y_log10()
q    = ggplot_build(p)
r    = q$panel$y_scales
trans.y = (q$panel$y_scales)[[1]]$trans$name
range.y = (q$panel$y_scales)[[1]]$rang

print(trans.y) 正是我想要的

[1] "log-10"

但是 range.y 是一个时髦的 S4 对象(见下文)。

> print(range.y)
Reference class object of class "Continuous"
Field "range":
[1] 0 2
> unclass(range.y)
<S4 Type Object>
attr(,".xData")
<environment: 0x11c9a0630>

我不太了解S4 对象或如何查询它们的属性和方法。或者,如果我只是在这里走错了兔子洞,更好的解决方案会很棒 :) 在 Matlab 中,我可以只使用命令 "get(gca,'YScale')" 和 "get(gca,'YLim')",所以我想知道我是否'让这变得比需要的更难。

正如@MikeWise 在评论中指出的那样,如果您将 ggplot 更新到 v2.0,这一切都会变得容易得多。它现在使用 ggproto 个对象而不是 proto,并且从中获取信息更方便。

现在很容易找到您需要的东西。只需打印 ggplot_build(p) 即可为您提供所有内容的精美列表。

ggplot_build(p)$panel$y_scales[[1]]$range 这里给你一个 ggproto 对象。你可以看到它包含几个部分,其中之一是 range (再次),其中包含数据范围。一直往下,你最终得到:

ggplot_build(p)$panel$y_scales[[1]]$range$range

# [1] 0 2

其中 0 是 10^0 = 1,2 是 10^2 = 100。

另一种方法可能是像这样在 $data 部分中查找它:

apply(ggplot_build(p)$data[[1]][1:2], 2, range)

#   y   x
# 1 0   1
# 2 1  10
# 3 2 100

您还可以通过以下方式获取绘图的实际范围 window:

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

[1] -0.1  2.1