2015-09-04 4 views
0

У меня есть приличный выглядящий график, который я виде графиков, используяR: передать Graph в качестве параметра функции

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 
} 

, когда я передаю параметры

r -> graphPoint(r,500) 

это дает ошибку

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

я не большой с R. Надеюсь, что это возможно, Но я скучаю по какой-то небольшой точке. Спасибо.

+0

Есть ли причина, по которой вы хотите сделать это в функции? В противном случае вы можете добавить переменную «highlight» к исходным данным и покрасить свои очки/изменить размер. – 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 не работает, заключается в том, что он использует 'point' в' aes (...) 'call * внутри функции *. – jlhoward

+0

Не знал этого, спасибо! – Edwin

2

Это на самом деле очень тонкая (и раздражающая ...) проблема в ggplot, хотя и не ошибка. Функция aes(...) оценивает все символы сначала в контексте набора данных по умолчанию (например, ищет столбцы с этим именем), а если это не удается в глобальной среде. Он не движется вверх по вызывающей цепочке, как вы могли бы оправдать это. Поэтому в вашем случае символ point сначала оценивается в контексте data2.Gurgaon. Поскольку такого столбца нет, он ищет 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 с чем-то иным, чем 10: вы получите тот же сюжет).

Правильный способ этого заключается в подмножестве аргумента data=..., как показано в другом ответе.

Смежные вопросы