R:如何在函数中传递参数给ggplot geom_?

rbpvctlc  于 2023-02-27  发布在  其他
关注(0)|答案(3)|浏览(118)

我尝试创建一个组合了几个geom_的实用函数,如下面的例子所示(不起作用):

my_geom_y <- function(yy, colour){
  geom_line(aes(y=yy), col=colour) + geom_point(aes(y=yy), col=colour)
}

这样我就可以这样做了

myX <- 0:90
ggplot(mapping = aes(x=myX)) + my_geom_y(dlnorm(myX), "red") + my_geom_y(dexp(myX), "blue")

这可能吗?
我尝试使用get()eval()substitute()as.name(),但没有效果。查看相关帖子:passing parameters to ggplotUse of ggplot() within another function in R没有帮助。

bxgwgixi

bxgwgixi1#

我喜欢MSM的方法,但是如果你想把my_geom_y添加到你已经做好的ggplot中,这是一个可能适合你的选择:

library(ggplot2)
x <- 1:100

my_geom_y <- function(yy, colour = "black"){
  list(
    geom_line(mapping = aes(y= yy), 
              col = colour), 
              data = data.frame(x, yy)),
    geom_point(mapping = aes(y = yy), 
               col = colour, 
               data = data.frame(x, yy))
  )
 }

ggplot(mapping = aes(x))  + 
  my_geom_y(x, "red") + 
  my_geom_y(dlnorm(x), "blue") +
  my_geom_y((x^1.1), "black") +
  my_geom_y(x/2, "yellow")

gjmwrych

gjmwrych2#

我没有足够的声誉来评论,所以这里有一个建议:

my_geom_y <- function(xx, yy, colour){
    ggplot() + 
    geom_line(aes(x=xx, y=yy), col=colour) + 
    geom_point(aes(x=xx, y=yy), col=colour)
}

这将创建一个plot,要创建多个plot,你需要将你的输入作为一个列表传递给函数,并在函数内部为每个geom循环(因为我们不能添加两个或更多的ggplot对象)-如果这样做有意义的话。

eqqqjvef

eqqqjvef3#

基于@luke-c的思想,这使得函数独立,剪切和粘贴准备就绪。我们现在也可以添加标签到每个曲线。

my_geom_y <- function(.xx, .yy, yLabel = 1, .colour=NA ){
  if (is.na(.colour)) 
    .colour <- palette()[yLabel%%length(palette())]
  list( geom_line(mapping=aes(.xx,.yy), col=.colour,  data=data.frame(.xx, .yy)), 
        geom_point(mapping=aes(.xx,.yy), col=.colour, data=data.frame(.xx, .yy)),
        annotate(geom="text" , col = .colour, label=deparse(substitute(.yy)),
                 x=mean(.xx),y=max(.yy)-(max(.yy)-min(.yy))/20*yLabel)
        )
}
myX <- 1:10
ggplot() + my_geom_y(myX, dlnorm(myX), 1) + 
           my_geom_y(myX, dexp(myX), 2) + my_geom_y(myX, dexp(myX,0.7), 3)

当您需要直观地比较多个分布时,此函数会变得非常方便。

相关问题