2015-09-04 106 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=...參數進行子集化,如其他答案中所示。

相關問題