передача параметров ggplot

18

хотел бы создать функцию, которая генерирует графики с помощью ggplot. Для простоты типичный граф может быть

ggplot(car, aes(x=speed, y=dist)) + geom_point() 

Функция, которую я хотел бы создать, имеет тип

f <- function(DS, x, y) ggplot(DS, aes(x=x, y=y)) + geom_point()

Это, однако, не будет работать, так как x и y не являются строками. Эта проблема была отмечена в предыдущих SO-вопросах (например, этот ), но без предоставления, на мой взгляд, удовлетворительного ответа. Как изменить функцию выше, чтобы заставить ее работать с произвольными кадрами данных?

    
задан gappy 27.06.2011 в 06:59
источник

3 ответа

34

Одним из решений было бы передать x и y в виде строковых имен столбцов в кадре данных DS.

f <- function(DS, x, y) {    
  ggplot(DS, aes_string(x = x, y = y)) + geom_point()  
}

И затем вызовите функцию как:

f(cars, "speed", "dist")

Однако, похоже, вы этого не хотите? Можете ли вы привести пример, почему вам нужны разные функции? Это потому, что вы не хотите иметь аргументы в одном кадре данных?

    
ответ дан Grega Kešpret 27.06.2011 в 07:46
источник
  • Красиво. Я просто не знал, что этот вариант существует. Благодарю. –  gappy 27.06.2011 в 08:20
  • Нет проблем, рад, что я мог бы помочь. Спасибо, что приняли мое решение. –  Grega Kešpret 27.06.2011 в 10:01
  • знал это, забыл. заново открыл его благодаря вашему ответу. +1 –  Matt Bannert 01.11.2012 в 16:06
  • Почему DS не требует «", но x и y делает? Не могли бы вы объяснить. –  Geekuna Matata 14.05.2014 в 21:50
  • Отлично! Я не знал вариант aes_string, пока не увижу этот пост. –  BioCoder 17.09.2015 в 09:47
7

Я думаю, что возможен следующий тип кодов, которые только создают компонент aes .

require(ggplot2)

DS <- data.frame(speed=rnorm(10), dist=rnorm(10))

f <- function(DS, x, y, geom, opts=NULL) {
  aes <- eval(substitute(aes(x, y),
    list(x = substitute(x), y = substitute(y))))
  p <- ggplot(DS, aes) + geom + opts
}

p <- f(DS, speed, dist, geom_point())
p

Однако это, кажется, сложный подход.

    
ответ дан Triad sou. 27.06.2011 в 08:13
источник
  • Лучшим подходом было бы пропустить преобразование в текст и только построить компонент aes: xName <- substitute (x); yName <- substitute (y); eval (замените (aes (x, y), list (x = xName, y = yName))) –  hadley 27.06.2011 в 14:58
  • Спасибо @hadley. Я думаю, что этот подход более простой, чем мой. –  Triad sou. 28.06.2011 в 07:16
  • Я обновил: для улучшения кода. –  Triad sou. 28.06.2011 в 10:15
0

Другой вариант - использовать do.call. Вот скопируйте одну копию копии из рабочего кода:

gg <- gg + geom_rect( do.call(aes, args=list(xmin=xValues-0.5, xmax=xValues+0.5, ymin=yValues, ymax=rep(Inf, length(yValues))) ), alpha=0.2, fill=colors )
    
ответ дан Özgen Eren 31.03.2018 в 01:37
источник