#r #ggplot2
Допустим у меня есть данные
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)
}
Заранее спасибо за помощь.
Ответы
Ответ 1
На основании комментария @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 было бы интересно увидеть.
Комментариев нет:
Отправить комментарий