Страницы

Поиск по вопросам

вторник, 27 ноября 2018 г.

Создание функции ggplot

Допустим у меня есть данные
data=data.frame(s=c(10,13,17,8), pr=c("a","b","a","b"), m=c(rep(as.Date('01.01.2015','%d.%m.%Y'),2), rep(as.Date('01.02.2015','%d.%m.%Y'),2)), pr2=c("c","d","d","c"))
И я пытаюсь создать функцию которая рисует ggplot в зависимости от col1 - колонка по которой нужно делать fill
plot_function=function(col1){...}
Функция должна возвращать ggplot
ggplot(data = data, aes(x = as.factor(m), y = s/2,fill=col1 ,ymax = max(s/2)*1.1)) + geom_bar(position = "dodge", stat="identity") + geom_text(aes(y=s/4,label=paste(round(s/2,3),"%")),position = position_dodge(.9)) + scale_x_discrete(labels = function(x) format(as.Date(x), "%m/%y")) + xlab("m")
где fill переменная внутри функции.
Пробовал сделать нечто подобное используя aes_string() вместо aes() но не знаю как совместить операции над переменными например s/2 и aes_string()
Так же смотрел lazyeval , который я использовал в подобных ситуациях когда делал функции из dplyr, но не смог понять как его тут применить.
в dplyr я делал вот так
group=function(data,...){
dat1=group_by_(data,.dots = lazyeval::lazy_dots(...)) return(dat1) }
Заранее спасибо за помощь.


Ответ

На основании комментария @ArtemKlevtsov и свои догадок на этот счет в итоге сделал вот так
gr_plot=function(data_12,nm){
i=which(colnames(data_12)==nm)
data_12$var=data_12$s/2 data_12$m=as.factor(data_12$m) j=which(colnames(data_12)=="m") k=which(colnames(data_12)=="var")
return( ggplot(data = data_12, aes_string(x = names(data_12)[j], y = names(data_12)[k],fill=names(data_12)[i]))+ geom_bar(position = "dodge",stat="identity")+ geom_text(aes(y=s/4,label=paste(round(s/2,3),"%")),position = position_dodge(.9)) + scale_x_discrete(labels = function(x) format(as.Date(x), "%m/%y")) + xlab("m")
) }
соответственно достаточно просто нарисовать в различных разрезах
gr_plot(data,"pr")

gr_plot(data,"pr2")

Если у кого то есть идеи как сделать нечто подобное через lazyeval было бы интересно увидеть.

Комментариев нет:

Отправить комментарий