【问题标题】:passing string to ggplot function将字符串传递给ggplot函数
【发布时间】:2013-12-11 05:33:43
【问题描述】:

我想要一个可以应用于任何符合条件的对象的函数,并有一个漂亮的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
}

我做错了什么?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    由于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
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用索引指定列。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-28
        • 1970-01-01
        • 2011-05-12
        • 2016-12-08
        • 2018-01-15
        相关资源
        最近更新 更多