将字符串传递给ggplot函数

时间:2013-11-26 07:26:26

标签: r ggplot2

我想有一个函数可以应用于符合条件的任何对象,并且有一个很好的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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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()