2013-11-26 84 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()尝试将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

您可以使用索引指定列。因为aes()试图评估数据的列名的说法

> 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()