Страницы

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

среда, 25 декабря 2019 г.

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

#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 было бы интересно увидеть.

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

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