R 围绕函数包装图形

R 围绕函数包装图形,r,ggplot2,R,Ggplot2,我有下面的代码,它似乎工作得很好,当我只是有它如下 p<-ggplot(data=x.all.ER, aes(x=Year, y=value, fill = (factor(x.all.ER$Strategy))))+ geom_bar(stat = 'identity',position = 'dodge', colour = "black") + scale_fill_manual(values = mycols) + scale_y_

我有下面的代码,它似乎工作得很好,当我只是有它如下

      p<-ggplot(data=x.all.ER, aes(x=Year, y=value, fill = (factor(x.all.ER$Strategy))))+ 
      geom_bar(stat = 'identity',position = 'dodge', colour = "black") +
      scale_fill_manual(values = mycols) +
      scale_y_continuous(breaks=  seq(-0.3,0.3,by=0.025), labels = percent) +
      ylab("ERET") + theme(axis.title.y = element_text(size=15, face = "bold"))+
      xlab("YEAR") + theme(axis.title.x = element_text(size=15, face = "bold"))
      print(p)
但是,当我尝试将它包装到另一个函数时,它会给我错误。非常感谢您的帮助。谢谢

      mybar<-function(DS, x, y, fillby, labels, mycols, xlabel, xbreaks, 
                                                            ylabel, title)
          {
     #my.cols =c("#F7FBFF", "#DEEBF7", "#C6DBEF", "#9ECAE1", "#6BAED6", 
             # "#000000","#2171B5")

      p<-ggplot(data=DS, aes(x=x, y=y, fill = fillby)+ 
              geom_bar(stat = 'identity',position = 'dodge', colour = "black") + 
              scale_fill_manual(values = mycols) +
              scale_y_continuous(breaks=  xbreaks, labels = percent) +
              ylab(ylabel) + 
              theme(axis.title.y = element_text(size=15, face = "bold"))+   
              xlab(xlabel) + 
              theme(axis.title.x = element_text(size=15, face = "bold"))
              print(p)
        }
您可以在ggplot2中键入x=x而不是x=x,因为DS data.frame基本上是附加在函数see?with中的,以了解发生了什么。对ggplot的调用正在DS数据帧中查找名为fillby的变量,但没有。正如评论中所建议的,解决这个问题的方法是使用aes_字符串函数

library(ggplot2)
df = data.frame( xx=1:10, yy=1:10+rnorm(10) )

# Regular use of ggplot
ggplot(df,aes(x=xx,y=yy)) + geom_point()

# wrapping ggplot in another function
myggplot = function( DF, x, y) {
  ggplot(df,aes(x=x,y=y)) + geom_point()
}
myggplot(df,x,y)
## Error in eval(expr, envir, enclos) : object 'x' not found
问题是ggplot正在data.frame中查找x列,因为myggplot中的ggplotdf,aesx=x,y=y。请注意,这将很好地工作

names(df) = c("x","y")
myggplot(df,x,y)
但这也将如此

names(df) = c("x","y")
myggplot(df,NULL,NA)
修复方法:

df = data.frame( xx=1:10, yy=1:10+rnorm(10) )
myggplot2 = function( DF, x, y) {
  ggplot(df,aes_string(x=x,y=y)) + geom_point()
}
myggplot2(df,"xx","yy")
如果你不想写引号,那就写吧

myggplot3 = function( DF, x, y) {
  ggplot(df,aes_string(x=deparse(substitute(x)),
                       y=deparse(substitute(y)))) + geom_point()

}
myggplot3(df,xx,yy)
您可以在ggplot2中键入x=x而不是x=x,因为DS data.frame基本上是附加在函数see?with中的,以了解发生了什么。对ggplot的调用正在DS数据帧中查找名为fillby的变量,但没有。正如评论中所建议的,解决这个问题的方法是使用aes_字符串函数

library(ggplot2)
df = data.frame( xx=1:10, yy=1:10+rnorm(10) )

# Regular use of ggplot
ggplot(df,aes(x=xx,y=yy)) + geom_point()

# wrapping ggplot in another function
myggplot = function( DF, x, y) {
  ggplot(df,aes(x=x,y=y)) + geom_point()
}
myggplot(df,x,y)
## Error in eval(expr, envir, enclos) : object 'x' not found
问题是ggplot正在data.frame中查找x列,因为myggplot中的ggplotdf,aesx=x,y=y。请注意,这将很好地工作

names(df) = c("x","y")
myggplot(df,x,y)
但这也将如此

names(df) = c("x","y")
myggplot(df,NULL,NA)
修复方法:

df = data.frame( xx=1:10, yy=1:10+rnorm(10) )
myggplot2 = function( DF, x, y) {
  ggplot(df,aes_string(x=x,y=y)) + geom_point()
}
myggplot2(df,"xx","yy")
如果你不想写引号,那就写吧

myggplot3 = function( DF, x, y) {
  ggplot(df,aes_string(x=deparse(substitute(x)),
                       y=deparse(substitute(y)))) + geom_point()

}
myggplot3(df,xx,yy)
使用aes_字符串。。。与另一个答案中的aes不同,这是实现这一点的惯用方法。实际上,我更喜欢一种稍微不同的方法:

mybar<-function(DS, x, y, fillby, label, mycols, xlabel, xbreaks, 
                ylabel, title) {
  require(ggplot2)
  gg <- data.frame(x=DS[,x],y=DS[,y],fill=DS[,fillby])
  p<-ggplot(gg, aes(x=x, y=y, fill = fill))+ 
    geom_bar(stat = 'identity',position = 'dodge', colour = "black") + 
    scale_fill_manual(values = mycols) +
    scale_y_continuous(breaks=  xbreaks, labels = percent) +
    ylab(ylabel) + 
    theme(axis.title.y = element_text(size=15, face = "bold"))+   
    xlab(xlabel) + 
    theme(axis.title.x = element_text(size=15, face = "bold"))
  print(p)         
}
这与您的相同,只是在函数中创建了一个新的df。这稍微慢一点,但有一个优点,即可以将列名或列号传递为x、y和fillby

还请注意,您传递了参数标签,但似乎没有对其做任何处理。

使用aes\u字符串。。。与另一个答案中的aes不同,这是实现这一点的惯用方法。实际上,我更喜欢一种稍微不同的方法:

mybar<-function(DS, x, y, fillby, label, mycols, xlabel, xbreaks, 
                ylabel, title) {
  require(ggplot2)
  gg <- data.frame(x=DS[,x],y=DS[,y],fill=DS[,fillby])
  p<-ggplot(gg, aes(x=x, y=y, fill = fill))+ 
    geom_bar(stat = 'identity',position = 'dodge', colour = "black") + 
    scale_fill_manual(values = mycols) +
    scale_y_continuous(breaks=  xbreaks, labels = percent) +
    ylab(ylabel) + 
    theme(axis.title.y = element_text(size=15, face = "bold"))+   
    xlab(xlabel) + 
    theme(axis.title.x = element_text(size=15, face = "bold"))
  print(p)         
}
这与您的相同,只是在函数中创建了一个新的df。这稍微慢一点,但有一个优点,即可以将列名或列号传递为x、y和fillby


还请注意,您传递了参数标签,但似乎没有对其做任何处理。

您很可能希望函数中包含aes_字符串。也许这个问题会有帮助,在你的第一个情节中,会有其他/更好的答案-你在策划什么?它是每个“年”/“策略”组合的最大“值”吗?对于初学者来说,在对ggplot的调用中缺少paren…您很可能希望函数中包含aes_字符串。也许这个问题会有帮助,在你的第一个情节中,会有其他/更好的答案-你在策划什么?它是每个“年度”/“战略”组合的最大“价值”吗?首先,在调用ggplot时,您缺少一个参数。。。