ggplot2: как прочитать преобразование масштаба из объекта графика
Я пытаюсь извлечь информацию об ограничениях и преобразовании существующего объекта 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 ответ
Как отмечает @MikeWise в комментариях, все это станет намного проще, если вы обновите ggplot
до версии 2.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