我正在尝试创建一个结合了多个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 ggplot,Use of ggplot() within another function in R没有帮助。
答案 0 :(得分:3)
我喜欢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")
答案 1 :(得分:1)
我没有足够的声誉来发表评论所以这是一个建议:
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)
}
这将创建一个图。要创建多个输入,您需要将输入作为列表传递给函数,并在函数内为每个geom循环(因为我们无法添加两个或更多ggplot对象) - 如果这是有意义的。
答案 2 :(得分:0)
基于@ 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)
当您需要在视觉上比较多个分布时,此功能会变得很方便。