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