【问题标题】:Writing a function for ggplot为ggplot编写函数
【发布时间】:2016-05-31 08:28:47
【问题描述】:

我是 R 新手,并且一直在尝试解决这个问题。基本上,我有一个数据框和各种y 变量。我正在尝试编写一个函数,它允许我为我拥有的许多不同的y 变量提供一个自定义的图形模板。我正在尝试下面的代码,但遇到了这个错误:

1:在 eval(expr, envir, enclos) 中:强制引入的 NAs

2: 在 aes_string(xvar[max(which(complete.cases(yvar)))], yvar[max(which(complete.cases(yvar)))], : 强制引入的 NAs

如果我直接添加变量而不是通过函数,代码就可以工作。我相信这与函数如何将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))

【问题讨论】:

  • aes_string 需要一个字符串。 xvar[max(which(complete.cases(yvar))) 在那里没有意义。在 ggplot2 之外计算。另外,不要在函数内部使用subset。它的文档对此提出了警告。
  • 非常感谢!我明白你的意思了!

标签: r plot


【解决方案1】:

由于 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")

【讨论】:

  • 我还是不明白如何纠正?我知道它是一个长度为 1 的字符向量(这与字符串相同吗?)。假设我最初有这样的数据:> X1 Y1 Data1
【解决方案2】:

我认为@LukeA 几乎已经让你走到了这一步,但这里有一个例子,它使用你的数据并添加了更多列来帮助演示如何将列名传递到你自己的函数中的 ggplot 中。

它使用你的变量名。它将您的数据子集到一个具有非缺失 y 值的 data.frame 中,然后将您的数据子集到一个单独的 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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2021-04-19
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多