Custom legend for lattice levelplot or ggplot2 map R
Asked Answered
P

1

7

Given the code, map and sample data below: instead of plotting names of watersheds etc on the map,how can I produce a seperate legend using ggplot2or levelplot just like one will do using ArcGIS? Basically, I will like to produce the legend shown on this map enter image description herepreferably with levelplotor ggplot2.

Code and map are included as well as sample data for plotting in R.

require(colorRamps)
require(raster)
require(rasterVis)
require(mapproj)
library(raster)    
library(proj4)


# Get province borders and project it to same CRS than raster
can1 <- getData('GADM', country="CAN", level=1)
getData('ISO3') # country name
dem=getData('alt', country='CAN', mask=TRUE)


require( colorRamps )
my.at <- unique(round(seq(ceiling(5800), floor(1), length.out = 51),0))#at: numeric vector specifying where the colors change. must be of length 1 more than the col vector.

myColorkey <- list(at=my.at,space = "bottom", tck = c(0,0),## where the colors change 
                   labels=list(axis.line = list(col = NA),at=myat1,rot=0,cex=1.4,font=1,
                               fontface=1),height=0.99,width=1.8)

col<-colorRampPalette(c("#d9d9d9", "#bdbdbd", "#969696", "#737373", "#525252", "#252525", "#000000"))


levelplot(dem,maxpixel=ncell(dem),panel=panel.levelplot.raster,names.attr=names(dem),
          interpolate=F,margin=FALSE,xlab=list(label="Longitude",cex=1.5),yscale.components = yscale.raster.subticks,
          xscale.components = xscale.raster.subticks,
          ylab=list(label="Latitude",cex=1.5),
          par.strip.text=list(cex=1),xlim=c(-158, -48.99485),
          ylim=c(38.00513, 85),col.regions=col,at = seq(0, 5800,100),
          colorkey = list(space = "bottom", labels = list(at = seq(0, 5800,800), rot=0,cex=1.1,font=6,fontface=1,
                                                          labels =c("0",  "800", "1600", "2400", "3200", "4000", "4800", "5600")),
                          height=0.99,width=1.8,tck = c(0,0)),
          par.settings=list(panel.background=list(col="white"),axis.line=list(lwd=1.9), strip.border=list(lwd=1.9),layout.heights=list(xlab.key.padding=-0.2)),
          cex=0.8, scales = list(x=list(draw=TRUE,cex=1.2), y=list(draw=TRUE,cex=1.2)))+
 layer(sp.polygons(can1,lwd=0.5,col="gray40"))+
 layer(sp.polygons(watershed,lwd=1,col=c("#a6cee3", "#1f78b4", "#b2df8a", "#33a02c", "#fb9a99", "#e31a1c", "#fdbf6f", "#ff7f00"),
                   fill=c("#a6cee3", "#1f78b4", "#b2df8a", "#33a02c", "#fb9a99", "#e31a1c", "#fdbf6f", "#ff7f00")))+
 layer(sp.polygons(lake,lwd=1,col="cadetblue1",fill="cadetblue1"))+
 layer(sp.lines(river,lwd=0.5,col="blue4"))+
 layer(sp.text(coordinates(watershed), txt = watershed$NAMRB_EN, pos =c(1,1,3,3,1,4,1,1),col="black",font=list(face="bold"),cex=0.8))

Figure 1

Prosthesis answered 18/2, 2018 at 19:13 Comment(2)
myat1 is unassigned.Iives
What is the purpose of the map? I would try to get rid of the color-filled polygons when I am interested in the elevation and just plot the boundaries of each watershed. For example, the Columbia watershed in the ArcGIS map completely destroys the information on elevation.Iives
I
0

You can try to adapt your code to this example to have a legend both for watersheds and elevation:

library(sp) 
library(raster) 
library(rasterVis) 

f <- system.file("external/test.grd", package="raster") 
r <- raster(f) 

data(meuse) 
coordinates(meuse) = c("x", "y") 
meuse$class <- cut(meuse$zinc, 3) 

ptsCols <- c('black', 'red', 'blue') 

lvp <- levelplot(r, margin = FALSE, 
                 ## Define the legend for the spplot graphic 
                 key = list(space = 'top', text = list(levels(meuse$class)), 
                     points = list(pch = 21, fill = ptsCols)), 
                 ## Legend for the Raster object 
                 colorkey=list(space="right",width=0.75,height=0.75)) 

spp <- spplot(meuse["class"], col.regions = ptsCols) 

lvp + spp 
Iives answered 26/2, 2018 at 7:22 Comment(2)
Thanks @Christpher. what about the lakes and rivers in the legend?Prosthesis
@christopher how can we replace the points in key to numerals??Jambeau

© 2022 - 2024 — McMap. All rights reserved.