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
Другие вопросы по тегам