вставка заголовка столбца в качестве метки оси - PullRequest
1 голос
/ 18 января 2020

У меня большой фрейм данных. Я хотел бы быстро построить график каждого из столбцов с помощью функции. У меня проблемы с получением метки оси Y для соответствия заголовку столбца.

Вот пример фрейма данных. Скажем, я хочу создать два графика с именем 1 и именем 2 в качестве оси y для каждого графика.

 dat <- data.frame(X = c(1, 2, 3, 4),
              name1 = c(50, 100, 200, 250),
              name2 = c(10, 20, 30, 40))

Я написал функцию для создания моего графика

 plot <- function (dat, col) {
   ggplot(dat, aes(x = X, y= {{col}}, group=1))+
     geom_point(size = 1)+
     geom_line(size = 0.5)+
     theme(axis.text.y = paste0({{col}}, "plus units and other text"))
 }

Затем я хочу создать свой график для столбца "name1"

 plot(dat, name1)

Это работает, если Я удаляю строку темы из моего кода функции. Я хочу, чтобы ось Y сказала «name1 плюс единицы и другой текст».

Ответы [ 2 ]

0 голосов
/ 18 января 2020

Если вы хотите использовать переменную для col, то внутри функции вы можете выполнить substitute () для захвата выражения для col, и обратите внимание, что для изменения должен быть ylab вместо theme (..) метка y:

    plot <- function (dat, col) {
   ggplot(dat, aes(x = X, y= {{col}}, group=1))+
     geom_point(size = 1)+
     geom_line(size = 0.5)+
     ylab(substitute(col))
     #ylab()
 }

Если вам нужно добавить более сложное выражение к вашему ylab, сделайте что-то вроде:

plot <- function (dat, col) {
   LAB=substitute(V:Ca ~ (µmol ~ mol^{-1}) , list(V = substitute(col)))
   ggplot(dat, aes(x = X, y= {{col}}, group=1))+
     geom_point(size = 1)+
     geom_line(size = 0.5)+
     ylab(LAB)
 }

Извлеките эту главу о квази-цитатах чтобы лучше их использовать.

0 голосов
/ 18 января 2020

Вы можете использовать aes_string и указать аргумент name1 в качестве строки для функции. Вы также можете использовать labs для обозначения заголовка оси.

plot <- function(dat, col) {
  ggplot(dat, aes(x = X)) +
    geom_point(aes_string(y=col)) +
    geom_line(aes_string(y=col)) +
    labs(y = paste0(col, "plus units and other text"))
}
plot(dat, 'name2')


Отредактировано после комментария @camilles. Второй вариант:
plotB <- function (dat, col) {
  colA <- enquo(col)
    ggplot(dat, aes(x = X, y= !!colA))+
      geom_point(size = 1)+
      geom_line(size = 0.5) +
      ylab(paste(quo_name(colA), ' Units'))
}

plotB(dat, name2)
...