R:如何在函数内将参数传递给ggplot geom_uu?

R:如何在函数内将参数传递给ggplot geom_uu?,r,ggplot2,R,Ggplot2,我正在尝试创建一个实用函数,它结合了几个geom\uu,如本例所示(不起作用): my_geom_y我没有足够的声誉发表评论,因此这里有一个建议: 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) } my_geom_y我没有足够的声誉发表评论,因此这

我正在尝试创建一个实用函数,它结合了几个
geom\uu
,如本例所示(不起作用):


my_geom_y我没有足够的声誉发表评论,因此这里有一个建议:

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)
}

my_geom_y我没有足够的声誉发表评论,因此这里有一个建议:

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)
}

my_geom_y我喜欢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")
库(ggplot2)

x我喜欢MSM的方法,但如果您希望能够将
my_geom\u 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")
库(ggplot2)

x基于@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)

my_geom_y基于@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)

my\u geom\y如果在美学中包含
x
,它是否有效?我认为你不可能只用
y
的映射来画线或点。多亏了卢克的回答,我现在明白了这是可能的。然而,问题并不是我在美学中没有包含x。解决方案实际上是双重的。它看起来有点不直观,但很管用:1)你必须使用
list()
来添加
geom
,2)你需要在
geom
中有
data=
参数(也就是说,仅仅从函数参数列表中找不到name
yy
),谁会想到!我只是在下面稍微修改了一下,所以它只引用内部参数。如果在美学中包含
x
,它是否有效?我认为你不可能只用
y
的映射来画线或点。多亏了卢克的回答,我现在明白了这是可能的。然而,问题并不是我在美学中没有包含x。解决方案实际上是双重的。它看起来有点不直观,但很管用:1)你必须使用
list()
来添加
geom
,2)你需要在
geom
中有
data=
参数(也就是说,仅仅从函数参数列表中找不到name
yy
),谁会想到!我只是在下面稍微修改了一下,所以它只引用内部参数。