Допустим у меня есть данные
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 было бы интересно увидеть.
Комментариев нет:
Отправить комментарий