Значение масштаба внутри aes_string () - PullRequest
0 голосов
/ 06 июня 2018

Я хочу масштабировать мой y-var, умножив его на число, скажем, 10, в ggplot.Проблема в том, что это приложение Shiny, и переменная должна быть передана в виде символьной строки, например input$variable.

. Как я могу умножить одну из переменных в aes_string() так же, как в aes()?Вот пример, когда это терпит неудачу:

 library(ggplot2)
 ggplot(data = subset(mtcars, cyl == 4), aes_string(x = "wt", y = "mpg")) + 
      geom_line(size = 1.5, color = "#00868B") + 
      geom_line(data = subset(mtcars, cyl == 8), aes_string(x = "wt", y = "mpg" * 10))

Ошибка в "mpg" * 10: нечисловой аргумент для двоичного оператора

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Вы можете использовать tidyeval подход, представленный в ggplot2 v3.0.0

# install.packages("ggplot2", dependencies = TRUE)
library(ggplot2)

var1 <- "wt"
var2 <- "mpg"
multiplier <- 10

ggplot(data = subset(mtcars, cyl == 4), 
       aes(x = !! rlang::sym(var1), y = !! rlang::sym(var2))) + 
  geom_line(size = 1.5, color = "#00868B") + 
  geom_line(data = subset(mtcars, cyl == 8), 
            aes(x = !! rlang::sym(var1), y = !! rlang::sym(var2) * multiplier))

Или поместить все в функцию

plot_select_vars <- function(var1, var2, multiplier) {

  var1 <- rlang::sym(var1)
  var2 <- rlang::sym(var2)

  ggplot(data = subset(mtcars, cyl == 4), 
         aes(x = !! var1, y = !! var2)) + 
    geom_line(size = 1.5, color = "#00868B") + 
    geom_line(data = subset(mtcars, cyl == 8), 
              aes(x = !! var1, y = !! var2 * multiplier))

}

plot_select_vars(var1, var2, multiplier)

Создано в 2018-06-06 пакетом Представление (v0.2.0).

0 голосов
/ 06 июня 2018

Я предпочитаю использовать get вместо aes_string для вызова переменных внутри ggplot2, и это работает с изменением значения, например:

library(ggplot2)
X <- "wt"
Y <- "mpg"
ggplot(subset(mtcars, cyl == 4), aes(get(X), get(Y))) + 
    geom_line() + 
    geom_line(data = subset(mtcars, cyl == 8), aes(y = get(Y) * 10)) +
    labs(x = X,
         y = Y)

enter image description here

PS: вам не нужно вызывать wt в секунду aes, поскольку это та же самая "переменная", что и в первом aes.

...