Как я могу написать функцию для масштаба ggplot2 в рабочем процессе dplyr? - PullRequest
2 голосов
/ 10 июля 2020

Я хотел бы установить метки в ggplot2::scale_x_discrete() (или аналогичный) динамически в рабочем процессе с одним конвейером, и, поскольку я терплю неудачу, похоже, я неправильно понимаю, как работают трубы. Я проиллюстрирую свой вопрос двумя приведенными ниже примерами, пример 1 работает нормально, а пример 2 - это мой желаемый способ написания кода. Я хотел бы манипулировать метками измененной переменной одним движением.

library(dplyr)
library(ggplot2)

Работает следующее. Как видите, я могу управлять уровнями disp, обращаясь к промежуточным данным. Frame df

# Example 1
df <- 
  mtcars %>% 
  mutate(disp = cut(disp, breaks = 5)) 

df %>%   
  ggplot(aes(disp, hp)) +
  geom_point() + 
  scale_x_discrete(labels = substring(levels(df$disp), 2, 4))

Но то, что я хотел бы написать, выглядит примерно так (не работает)

# Example 2
mtcars %>% 
  mutate(disp = cut(disp, breaks = 5)) %>%
  ggplot(aes(disp, hp)) +
  geom_point() + 
  scale_x_discrete(labels = substring(levels(.data$disp), 2, 4))

Что нужно писать вместо .data$disp?

Ответы [ 2 ]

4 голосов
/ 10 июля 2020

Вы можете использовать фигурные скобки, чтобы преобразовать весь ggplot в одно выражение

mtcars %>% 
  mutate(disp = cut(disp, breaks = 5)) %>%
  {
    ggplot(data = ., aes(disp, hp)) +
    geom_point() + 
    scale_x_discrete(labels = substring(levels(.$disp), 2, 4))
  }

Затем вы можете ссылаться на данные как . повсюду.

3 голосов
/ 10 июля 2020

Вы можете передать функцию в labels аргумент:

library(dplyr)
library(ggplot2)

mtcars %>% 
  mutate(disp = cut(disp, breaks = 5)) %>%
  ggplot() + aes(disp, hp) + 
  geom_point() + 
  scale_x_discrete(labels = function(x) substring(x, 2, 4))

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...