我有一个体面的图表,我使用
绘制r <- ggplot(data=data2.Gurgaon,aes(x=createdDate,y=count))+geom_point()
现在我想高亮点图上的几点说500,1000,5000等。 所以,我正在尝试编写一个函数,在其中我可以传递我想要标记的点 以下是我写的函数
graphPoint <- function(graph,point) {
g <- graph
g <- g+geom_point(aes(x=createdDate[point],y=count[point]),pch=1,size=8,col='black')
g <- g+ geom_point(aes(x=createdDate[point],y=count[point]),pch=16,size=5,col='red')
g
}
当我传递参数时
r -> graphPoint(r,500)
这是错误
Error in lapply(X = x, FUN = "[", ..., drop = drop) :
object 'point' not found
我对R不是那么好。希望它可能,但我在某个小点失踪了..谢谢。
答案 0 :(得分:2)
这实际上是ggplot
中一个非常微妙(并且令人烦恼......)的问题,尽管不是一个错误。 aes(...)
函数首先在默认数据集的上下文中评估所有符号(例如,它查找具有该名称的列),如果在全局环境中失败,则。它并没有向调用链上移,正如你可能有理由期望的那样。因此,在您的情况下,首先在point
的上下文中评估符号data2.Gurgaon
。由于没有这样的列,它在全局环境中查找point
,但在graphPoint(...)
函数的上下文中查找 not 。这是一个演示:
df <- mtcars
library(ggplot2)
graphPoint <- function(graph,point) {
g <- graph
g <- g + geom_point(aes(x=wt[point],y=mpg[point]),pch=1,size=8,col='black')
g <- g + geom_point(aes(x=wt[point],y=mpg[point]),pch=16,size=5,col='red')
g
}
ggp <- ggplot(df, aes(x=wt, y=mpg)) + geom_point()
point=10
graphPoint(ggp, 10)
这是有效的原因是因为我在全球环境中定义了point
;函数内的point
变量被忽略(你可以通过用10以外的东西调用fn来证明:你会得到相同的图)。
解决这个问题的正确方法是对data=...
参数进行子集化,如另一个答案中所示。
答案 1 :(得分:1)
您无法在ggplot函数的美学部分中选择数据的子集,就像您尝试的那样。但是,您可以通过从ggplot
对象中提取原始数据,对其进行子集化以及在函数的其余部分中使用子集来实现此目的。
r <- ggplot(data=mtcars,aes(x=cyl,y=drat))+geom_point()
graphPoint <- function(graph,point) {
g <- graph
data_subset <- g$data[point, ]
g <- g+geom_point(data = data_subset,
aes(x=cyl,y=drat),pch=1,size=8,col='black')
g <- g+ geom_point(data = data_subset,
aes(x=cyl,y=drat),pch=16,size=5,col='red')
g
}
graphPoint(r, point = 2)
PS即将发布的帖子我建议您使用通常可访问的数据(如mtcars
数据)制作可重现的示例。这样可以更轻松地帮助您。