2015-09-04 73 views
0

我有一个体面的美观的图表,这是我绘制的使用R:通过图形作为参数传递给函数

r <- ggplot(data=data2.Gurgaon,aes(x=createdDate,y=count))+geom_point() 

现在我想在图形上higlight几点说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 
} 

当我传递参数

功能

这是给错误

Error in lapply(X = x, FUN = "[", ..., drop = drop) : 
    object 'point' not found 

我是不与R很大。希望它有可能,但我在一些小的点失踪..谢谢。

+0

有没有你想在功能上做到这一点的原因?否则,您可以为原始数据添加一个“高亮”变量,并为其着色/更改大小。 – Heroka

回答

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数据进行重复的例子。这会让你更容易帮助你。

+0

你的代码确实运行了,但这不是严格的事实:“你不能在ggplot函数的美学部分中选择一部分数据......”。事实上你可以。 OP代码失败的原因是因为他在函数内的'aes(...)'call *中使用'point'。 – jlhoward

+0

不知道,谢谢! – Edwin

2

ggplot中这实际上是一个非常微妙的(并且令人讨厌的)问题,虽然不是一个错误。 aes(...)函数首先在默认数据集的上下文中评估所有符号(例如,它会查找具有该名称的列),并且如果在全局环境中失败。它不会向调用链上移,因为您可能有理由期待它。所以在你的情况下,首先在data2.Gurgaon的上下文中评估符号point。由于没有这样的列,因此它在全球环境中查找point,但在您的graphPoint(...)函数的上下文中查找而不是。这里是一个演示:

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变量被忽略(你可以通过调用fn以外的其他值来证明:你会得到同样的图)。

解决此问题的正确方法是将data=...参数进行子集化,如其他答案中所示。

相关问题