ggplot sec_axis я могу использовать вектор для формулы транс? - PullRequest
0 голосов
/ 12 декабря 2018

Я хотел бы обозначить ось X двумя нелинейно, но монотонно связанными значениями.Один - дециль, а другой - среднее в дециле.Поскольку между ними нет алгебраического преобразования, хотя я мог бы использовать вектор, но ggplot выдает мне сообщение об ошибке, что преобразование должно быть монотонным.Как это проверяет и есть ли способ сделать то, что я пытаюсь?

df <- 
  data.frame(x = rnorm(500)) %>%
  mutate(y = 1 + 2 * x) %>%
  arrange(x) %>% 
  mutate(decile = ceiling(10 * 1:500 / 500)) %>% 
  group_by(decile) %>%
  summarize(x = mean(x), y = mean(y))

 sec_axis_label = df$x

df %>% 
  ggplot(aes(decile, y)) +
  scale_x_continuous(expand = c(0, 0), 
    sec.axis = sec_axis(~ sec_axis_label[.])) +  
   geom_point() 

1 Ответ

0 голосов
/ 12 декабря 2018

sec_axis требует преобразования (формула), а не поиска.Чтобы увидеть, что происходит, я изменю это следующим образом:

sec_axis_label <- function(z) { browser() ; 1 ; }
df %>% 
   ggplot(aes(decile, y)) +
   scale_x_continuous(expand = c(0, 0), 
     sec.axis = sec_axis(~ sec_axis_label(.))) +  
   geom_point() 

Мы можем исследовать и посмотреть, что происходит:

# Browse[2]> 
str(z)
#  num [1:1000] 1 1.01 1.02 1.03 1.04 ...
# Browse[2]> 
range(z)
# [1]  1 10
# Browse[2]>
Q

Это дает вам достаточно потенциальных значений, так чтопреобразование вернет значимый диапазон значений других осей, чтобы определить наилучшие симпатичные числа.

Итак, нам нужно преобразование сортов.Если мы предполагаем, что интерполяция безопасна (я не знаю, безопасна ли она для вас), мы можем сделать:

sec_axis_label <- function(a) approx(df$decile, df$x, xout=a)$y
df %>% 
  ggplot(aes(decile, y)) +
  scale_x_continuous(expand = c(0, 0), 
    sec.axis = sec_axis(~ sec_axis_label(.))) +  
   geom_point() 

simple decile/sec_axis plot

...