Raster map with discrete color scale for negative and positive values R

前端 未结 1 870
刺人心
刺人心 2021-02-10 21:00

I have two dataframes which I will like to map. The dfs have the same xy coordinates and I need a single colorbar with a visible discrete color scale

相关标签:
1条回答
  • 2021-02-10 21:11

    The following should get you going. With the ggplot2 documentation and the many online examples,you should be able to tweak the aesthetics to get it to look exactly as you want without any troubles.Cheers.

    #Order breaks from lowest to highest
      my_at <- sort(my_at)
    
    #Get desired core colours from brewer
      cols0 <- brewer.pal(n=length(my_at), name="RdYlBu")
    
    #Derive desired break/legend colours from gradient of selected brewer palette
      cols1 <- colorRampPalette(cols0, space="rgb")(length(my_at))
    
    #Convert raster to dataframe
      df <- as.data.frame(s, xy=T)
      names(df) <- c("x", "y", "Epoch1", "Epoch2")
    
    #Melt n-band raster to long format
      dfm <- melt(df, id.vars=c("x", "y"), variable.name="epoch", value.name="value")
    
    #Construct continuous raster plot without legend
      #Note usage of argument `values` in `scale_fill_gradientn` -
      #-since your legend breaks are not equi-spaced!!!
      #Also note usage of coord_equal()
      a  <- ggplot(data=dfm, aes(x=x, y=y)) + geom_raster(aes(fill=value)) + coord_equal()+
            facet_wrap(facets=~epoch, ncol=1) + theme_bw() + 
    
            scale_x_continuous(expand=c(0,0))+
            scale_y_continuous(expand=c(0,0))+
            scale_fill_gradientn(colours=cols1,
                                 values=rescale(my_at),
                                 limits=range(dfm$value),
                                 breaks=my_at) +
            theme(legend.position="none", panel.grid=element_blank())
    
    #Make dummy plot discrete legend whose colour breaks go along `cols1`
      df_leg <- data.frame(x=1:length(my_at), y=length(my_at):1, value=my_at)
      gg_leg <- ggplot(data=df_leg, aes(x=x, y=y)) + geom_raster(aes(fill=factor(value))) +
                scale_fill_manual(breaks=my_at, values=cols1,
                                  guide=guide_legend(title="",
                                                     label.position="bottom")) +
                theme(legend.position="bottom")
    
    #Extract discrete legend from dummy plot
      tmp <- ggplot_gtable(ggplot_build(gg_leg))
      leg <- which(sapply(tmp$grobs, function(x) x$name)=="guide-box")
      legend <- tmp$grobs[[leg]]
    
    #Combine continuous plot of your rasters with the discrete legend
      grid.arrange(a, legend, ncol=1, heights=c(4, 0.8))
    

    0 讨论(0)
提交回复
热议问题