2013-11-26 2 views
2

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

Однако я не могу обобщить то, что я могу сделать на REPL с кодом.

так что я эту работу:

require(ggplot2)  
require(xts) 
set.seed(1) 
dd = xts(cbind(rnorm(10), runif(10)), order.by = Sys.Date() + 1:10) 
names(dd) <- c('d1', 'd2') 

gp <- ggplot(data = dd, 
      aes(x = d1, y = d2)) + 
     geom_point(shape=1) + 
     geom_smooth(method = lm) 

Но это не удается

PointReg <- function(Xts, a=1, b=2) { 
    stopifnot(is.xts(Xts), 
       ncol(Xts) >1) 
    tempData <- Xts[, c(a,b)] 
    gPlot <- ggplot(data = tempData, 
       aes(x = colnames(tempData)[1], 
        y = colnames(tempData)[2])) + 
      geom_point(shape=1) + 
      geom_smooth(method = lm) 
    gPlot 
} 

Что я делаю неправильно?

ответ

2

Ваша функция выдает ошибку, поскольку aes() пытается оценить аргумент в названиях столбцов данных. Чтобы быть более конкретным, aes() пытается оценить colnames(tempData)[1] как имя столбца, и этот столбец не существует.

Чтобы исправить это, вам необходимо сообщить ggplot, что вы не передаете имя столбца, а выражение (строку), которое будет разрешено для имени столбца.

Для этого используйте aes_string(). Конкретно, просто замените aes() на aes_string(). Попробуйте это:

PointReg <- function(Xts, a=1, b=2) { 
    stopifnot(is.xts(Xts), 
      ncol(Xts) >1) 
    tempData <- Xts[, c(a,b)] 
    gPlot <- ggplot(data = tempData, 
        aes_string(x = colnames(tempData)[1], 
         y = colnames(tempData)[2])) + 
    geom_point(shape=1) + 
    geom_smooth(method = lm) 
    gPlot 
} 

enter image description here

0

Вы можете указать столбцы, используя индексы.

> library(ggplot2) 
> df <- data.frame(a = 1:10, b = 1:10, c=c("x")) 
> ggplot(data = df, aes(x = df[,1], y = df[,2])) + geom_line() 
Смежные вопросы