ggheatmap<-function(df, x=NULL, y=NULL, value=NULL, grouping="mean", exclude_group=NULL, scale="none",color="#FFFFFF00"){ if (is.null(x)){x=colnames(df)[1]} if (is.null(y)){y=colnames(df)[2]} if (is.null(value)){value=colnames(df)[3]} df<-rename(df, "VarX"=all_of(x), "VarY"=all_of(y), "Value"=all_of(value)) if (is.null(exclude_group)){ df<-df %>% group_by(VarX,VarY) }else{ df<-df %>% group_by_("VarX","VarY",exclude_group) #%>% rename(exclude_group="all_of(exclude_group)") } if (grouping == "mean"){ df<-df %>% summarise(Value=mean(Value)) %>% ungroup } if (grouping == "median"){ df<-df %>% summarise(Value=median(Value)) %>% ungroup } if (length(unique(df$VarX)) > 1 & length(unique(df$VarY)) > 1){ order<-clustsort(df %>% spread(VarY,Value) %>% select(!all_of(exclude_group)) %>% as.data.frame) }else{ order<-list() if (length(unique(df$VarX)) > 1){ xhclust<-clustsort(df %>% spread(VarY,Value) %>% select(!all_of(exclude_group)) %>% as.data.frame) order[["x"]]<-pull(xhclust, 1)[hclust(dist(xhclust %>% select(-1)))$order] }else{order[["x"]]<-df %>% pull(VarX) %>% unique} if (length(unique(df$VarY)) > 1){ yhclust<-clustsort(df %>% spread(VarY,Value) %>% select(!all_of(exclude_group)) %>% as.data.frame) order[["y"]]<-colnames(yhclust)[2:ncol(yhclust)][hclust(dist(t(yhclust %>% select(-1))))$order] }else{order[["y"]]<-df %>% pull(VarY) %>% unique} } if (scale != "none"){ if (scale == "rows"){ cols<-unique(df$VarY) sca.df<-spread(df, VarY, Value) for (i in cols){sca.df[,i]<-scale(sca.df[,i])} df<-gather(sca.df, VarY, Value, all_of(cols)) } if (scale == "cols"){ cols<-unique(df$VarX) sca.df<-spread(df, VarX, Value) for (i in cols){sca.df[,i]<-scale(sca.df[,i])} df<-gather(sca.df, VarX, Value, all_of(cols)) } } df$VarX<-factor(df$VarX, levels=order$x) df$VarY<-factor(df$VarY, levels=order$y) df %>% ggplot(aes(VarX, VarY, fill=Value))+ labs(x=x, y=y)+ geom_tile(aes(fill=Value), color=color)+ scale_fill_gradientn(colors=col2(200))+ theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust=0.5), panel.background = element_blank(), axis.ticks = element_blank()) }