2015-12-04 2 views
0

я пропущу право на пример и комментарии послесловия:Попутных имен данных и столбцов в ggplot через другую функцию

cont <- data.frame(value = c(1:20),variable = c(1:20,(1:20)^1.5,(1:20)^2),group=rep(c(1,2,3),each=20)) 

    value variable group 
1  1 1.000000  1 
2  2 2.000000  1 
3  3 3.000000  1 
#... etc. 

#ser is shorthand for "series". 
plot_scat <- function(data,x,y,ser) { 
     ggplot(data,aes(x=x,y=y,color=factor(ser)))+geom_point() 
} 

plot_scat(cont,value,variable,group) 
#This gives the error: 
#Error in eval(expr,envir,enclose) : object 'x' not found 

Теперь я знаю, что ggplot2 имеет известную ошибку, где АЕС() будет только смотреть в глобальной окружающей среды, а не в местной среде. Следуя советам: Use of ggplot() within another function in R, я попробовал другой маршрут.

plot_scat <- function(data,x,y,ser) { 
     #environment=environment() added 
     ggplot(data,aes(x=x,y=y,color=factor(ser)),environment=environment())+geom_point() 
} 

plot_scat(cont,value,variable,group) 
#This gives the error: 
#Error in eval(expr,envir,enclos) : object 'value' not found 
#In addition: Warning message: 
#In eval(expr,envir,enclos) : restarting interrupted promise evaluation 

Я не знаю, что это за последняя линия означает. Если я звоню: ggplot (cont, aes (x = value, y = variable, color = group)) + geom_point()

Я получаю график, который вы ожидаете. В командной строке aes() ищет имена переменных в ggplot(), но это не делает этого в вызове функции. Поэтому я попытался поменять мой звонок:

plot_scat(cont,cont$value,cont$variable,cont$group) 

Это дает мне то, что я хочу. Поэтому я добавляю следующий уровень сложности:

plot_scat <- function(data,x,y,ser) { 
     #added facet_grid 
     ggplot(data,aes(x=x,y=y,color=factor(ser)),environment=environment())+geom_point()+ 
     facet_grid(.~ser) 
} 

plot_scat(cont,cont$value,cont$variable,cont$group) 
#This gives the error: 
#Error in layout_base(data, cols, drop = drop): 
# At least one layer must contain all variables used for facetting 

Моей мысль о том, что серы на самом деле продолжение $ группы, которая отлично подходит для использования в AES(), но при передаче facet_grid теперь данные один столбца кадр без информации о значении и переменных. Согласно странице справки, facet_grid не принимает аргумент «data =», поэтому я не могу использовать facet_grid (data = data, ~ ser), чтобы обойти это. Я не знаю, как исходить отсюда.

Это очень простой пример, но долгосрочная цель состоит в том, чтобы иметь функцию, которую я могу дать не-R-грамотным людям в моем офисе, и сказать: «Дайте ей имя фрейма данных, имена столбцов и столбец, который вы хотите разделить, и это сделает для вас красивые сюжеты ». Он также будет намного сложнее, с очень настроенной темой, которая не имеет отношения к проблемам, которые у меня возникают.

ответ

0

Вы можете использовать aes_string() вместо aes() и передать имена столбцов в виде строк.

plot_scat <- function(data,x,y,ser) { 
ser_col = paste("factor(",ser,")") 
ggplot(data,aes_string(x=x,y=y,col=ser_col))+geom_point()+facet_grid(as.formula(sprintf('~%s',ser))) 
} 

plot_scat(cont,"value","variable","group") 

facet_grid требует формулы, так что вы можете использовать as.formula для разбора строки в формулу.

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