ggplot2:如何从绘图对象中读取比例尺转换

3
我正在尝试提取现有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')”,所以我想知道是否我让这变得比必要的难。

1个回答

1
如评论中@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

你可以使用以下代码获取绘图窗口的实际范围:
ggplot_build(p)$panel$ranges[[1]]$y.range

[1] -0.1  2.1

1
实际上,你必须指出他正在使用的是ggplot2版本1.0,该版本使用S4对象。版本2.0将所有内容切换到ggproto对象,这是其中之一的好处。在旧版ggplot中,这实际上相当困难,现在则容易得多。 - Mike Wise
1
是的,我也是,我想回答它,然后去了一台装有旧版本的电脑,但是无法弄清楚如何做,尽管在我的主要计算机上非常容易。看看打印q时会发生什么。你应该发布那个。 - Mike Wise
1
请注意,旧的“proto”对象是S4类型的对象,而“ggproto”显然不是。 - Mike Wise
非常感谢!非常不幸的是,我现在被困在ggplot2 1.0上。我猜我困惑的地方是我没有预料到需要连续使用"$range"两次(虽然我现在明白了为什么),而且我一直在寻找一个类似于c(1,100)而不是c(0,2)的内容。但现在一切都说得通了。再次感谢! - Andy Stein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接