为ggplot编写函数

为ggplot编写函数

问题描述:

我是R的新手,一直试图弄清楚这一点。基本上我有一个数据框,和各种变量。我正在尝试编写一个函数,使我能够为我所拥有的许多不同的y变量提供自定义图形模板。我想下面的下面的代码,但我遇到了这个错误:为ggplot编写函数

1: In eval(expr, envir, enclos) : NAs introduced by coercion

2: In aes_string(xvar[max(which(complete.cases(yvar)))], yvar[max(which(complete.cases(yvar)))], : NAs introduced by coercion

代码工作,如果我直接和不添加变量通过函数。我相信这与功能如何将xvar插入到as.numeric()函数中有关。我不确定,但你们中的任何一个人都知道如何处理这个问题?

test <- function (Data, xvar, yvar){ 
    # Plot data 
    plot <- ggplot(subset(Data,!is.na((yvar))), aes_string(xvar, yvar)) + geom_line(colour="darkblue") + theme_bw() 
    # Add Trendline for recent data 
    plot <- plot + geom_smooth(data=subset(Data, xvar > as.numeric(xvar)[max(which(complete.cases(yvar)))-8]), method = "lm") 
    # Label most recent data 
    plot + geom_text(data = Data, aes_string(xvar[max(which(complete.cases(yvar)))], 
          yvar[max(which(complete.cases(yvar)))], 
          label = as.numeric(yvar)[max(which(complete.cases(yvar)))], 
          hjust= -0.5, vjust = 0.5)) 
+0

'aes_string'需要一个字符串。 'xvar [max(which(complete.cases(yvar)))'在这里没有意义。在ggplot2之外计算这个值。另外,不要在函数内部使用'subset'。这是文件警告这一点。 – Roland

+0

非常感谢!我明白你的意思了! – Binggg

作为xvar可能是(你不显示可再现的例子)长度为1的字符向量,像xvar[]子集将不会产生所希望的结果。

你可以尝试像

library(ggplot2) 
f <- function(data, xvar, yvar) { 
    ggplot(data, aes_string(xvar, yvar)) + 
    geom_point() + 
    geom_smooth(data=subset(data, eval(parse(text=xvar)) > 5), method = "lm") 
} 

f <- function(data, xvar, yvar) { 
    ggplot(data, aes_string(xvar, yvar)) + 
    geom_point() + 
    geom_smooth(data = data[data[, xvar]>5, ], method = "lm") 
} 

f(mtcars, "cyl", "disp") 
+0

我仍然没有得到如何纠正?我知道它是一个长度为1的字符向量(这与字符串是否相同?)。假设我有一个这样的数据: > X1 Y1 Data1 Binggg

我觉得@LukeA已经得到了几乎你一路有,但这里是使用你的数据,并增加了一些例子更多的列可以帮助演示如何将列名传递到您自己的函数中的ggplot。

它使用你的变量名称。它将您的数据分成一个data.frame,其中y的值为非缺失值,然后将您的数据分为独立的data.frame,允许您为平滑功能添加额外的过滤标准。

library(zoo) 
set.seed(72) 

X1 <- as.yearqtr(seq(as.Date("2010/3/1"), by = "quarter", length.out = 10)) 
Y1 <- as.vector(c(124,315,363,574,345,434,141,512,142,647)) 
Y2 <- sample(Y1) 
Y3 <- sample(Y1) 

Data1 <- data.frame(X1, Y1, Y2, Y3) 


plot_function <- function(data, xvar, yvar){ 

    # remove rows with NA on yvar 
    mydata1 <- data[!is.na(data[, yvar]), ] 

    # remove rows with NA on yvar and subset yvar above some threshold 
    mydata2 <- data[!is.na(data[, yvar]) & data[, yvar] > 400, ] 

    # plot it 
    myplot <- ggplot(mydata1, aes_string(xvar, yvar)) + 
    geom_line(colour="darkblue") + 
    scale_x_yearqtr(limits = c(min(mydata1[, xvar]), max(mydata1[, xvar])), format = "%YQ%q") + 
    geom_smooth(data = mydata2, aes_string(xvar, yvar), method = "lm") + 
    geom_text(data = mydata1, aes_string(xvar, yvar, label = yvar), hjust= -0.5, vjust = 0.5) + 
    theme_bw() 

    return(myplot) 
} 


plot_function(data = Data1, xvar = "X1", yvar = "Y1") 
plot_function(data = Data1, xvar = "X1", yvar = "Y2") 
plot_function(data = Data1, xvar = "X1", yvar = "Y3")