【问题标题】:Function to pass data file and colums with names in R在 R 中传递具有名称的数据文件和列的函数
【发布时间】:2015-01-12 11:14:18
【问题描述】:

我想为不同的变量集运行一个 ggplot。我正在尝试制作一个函数,该函数可以将我想稍后在图中标记的数据、变量及其名称作为参数。以下是我想要的一个例子。您能否建议传递这些论点并获得结果的正确方法? 因为我收到以下错误
unique.default(x, nmax = nmax) 中的错误: unique() 仅适用于向量

v1 <- rep(c(2,4,6,8,10), each = 6)  
v2 <- rep(1:3,10)  
v3 <-runif(30,0.01,0.3)
v4 <-runif(30,0.05,0.9)
combined_data <- data.frame(v1,v2,v3,v4)  
library(ggplot2)
library(gridExtra)
p1<-myplot(combined_data, v3,v2,v1,"alpha1","beta","gamma")
p2<-myplot(combined_data, v4,v2,v1,"alpha2","beta","gamma")
grid.arrange(p1,p2) 

#--------------------------------------------------------------------------
myplot<-function(data, xvar, yvar, legend, xlab="", ylab="", factor="") 
{
 p<-ggplot(data,aes(x=xvar,y=yvar))+
  stat_summary(fun.y=mean,geom="smooth",aes(color=as.factor(legend)),linetype=2)+
  labs(x="xlab", y = "ylab", color = "factor")+
  theme(panel.grid.major = element_blank(),
      panel.grid.minor = element_blank(), 
      panel.background = element_blank(),
      axis.line = element_line(colour = "black")
      )
   return(p)
  }

【问题讨论】:

  • 您可以使用 aes_string 将所有变量映射到 ggplot 调用。不过,labs 中不需要 aes_stringlabs(x = xlab, y = ylab)(没有引号)应该可以工作。

标签: r ggplot2 lattice


【解决方案1】:

aes_string 是实现这一目标的最简单方法。但是,因为您还想将颜色变量设置为factor,所以还需要使用paste0("factor(", legend, ")") 构造。这是完整的代码。

myplot<-function(data, xvar, yvar, legend, xlab="", ylab="", factor="") 
{
  p<-ggplot(data, aes_string(x=xvar,y=yvar))+
    stat_summary(fun.y=mean, geom="smooth", 
                 aes_string(color=paste0("factor(", legend, ")")), 
                 linetype=2) +
    labs(x=xlab, y = ylab, color = factor)+
    theme(panel.grid.major = element_blank(),
          panel.grid.minor = element_blank(), 
          panel.background = element_blank(),
          axis.line = element_line(colour = "black")
    )
  return(p)
}
## --------------------------------------------------------------------------
p1 <- myplot(combined_data, "v3", "v2", "v1", "alpha1", "beta", "gamma")
p2 <- myplot(combined_data, "v4", "v2", "v1", "alpha2", "beta", "gamma")
grid.arrange(p1,p2) 

【讨论】:

  • 是否有一种通用的方法来考虑 aes(color=factor(eval(substitute(v1)) 中的 v1,因为有时我可能不得不使用不同的变量,比如 V3...
  • 查看我的编辑。您可以只使用paste 而根本不需要eval(substitute))
  • 在上面的例子中,如果我们有 10 个图,那么获得的线(一些)的颜色非常相似......很难区分。如何更改上述代码中的颜色,以使线条可以识别?
  • 十种可识别的颜色无论如何都很难。参见例如(colorbrewer2.org)。您可以使用?scale_color_brewer?scale_color_manual 更改配色方案。但是仍然很难区分十种颜色。
猜你喜欢
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多