Craig F. Barrett Department of Biology West Virginia University
This code shows you how generate fancy relief maps, gather occurrence data from GBIF, and include a .csv file of latitudes, longitudes, and taxa
e.g. Here is what the CSV file with collections infor looks like:
| 103a_NM |
vree |
-105.7481667 |
32.94283333 |
| 103a_NM |
vree |
-105.7481667 |
32.94283333 |
| 103a_NM |
vree |
-105.7481667 |
32.94283333 |
| etc |
etc |
etc |
etc |
### Get appropriate libraries
# if needed, install.packages(c("raster","dismo","rgbif","dplyr"))
library("raster") # for downloading relief map data
library("dismo") # for downloading gbif data -- approach 1
library("rgbif") # for downloading gbif data -- approach 2
library("dplyr") # for subsetting the data by taxon
### Get data for each species with "dismo" package
all<-gbif("Corallorhiza striata")
3226 records found
0-300-600-900-1200-1500-1800-2100-2400-2700-3000-3226 records downloaded
str<-gbif("Corallorhiza striata var. striata")
632 records found
0-300-600-632 records downloaded
vree<-gbif("Corallorhiza striata var. vreelandii")
235 records found
0-235 records downloaded
inv<-gbif("Corallorhiza striata var. involuta")
60 records found
0-60 records downloaded
ben<-gbif("Corallorhiza bentleyi")
34 records found
0-34 records downloaded
# Get altitude, spole, and aspect layers
alt.usa <- getData('alt', country = c("USA"), level = 1)
trying URL 'https://biogeo.ucdavis.edu/data/diva/msk_alt/USA_msk_alt.zip'
Content type 'application/zip' length 20073726 bytes (19.1 MB)
downloaded 19.1 MB
Discarded datum Unknown based on WGS84 ellipsoid in Proj4 definitionDiscarded datum Unknown based on WGS84 ellipsoid in Proj4 definitionDiscarded datum Unknown based on WGS84 ellipsoid in Proj4 definitionDiscarded datum Unknown based on WGS84 ellipsoid in Proj4 definitionreturning a list of RasterLayer objects
slope.usa <- terrain(alt.usa[[1]], opt='slope') # only first layer (country level)
aspect.usa <- terrain(alt.usa[[1]], opt='aspect')
alt.mex <- getData('alt', country = c("Mexico"), level = 1)
Discarded datum Unknown based on WGS84 ellipsoid in Proj4 definition
slope.mex <- terrain(alt.mex[[1]], opt='slope') # only first layer (country level)
aspect.mex <- terrain(alt.mex[[1]], opt='aspect')
alt.can <- getData('alt', country = c("Canada"), level = 1)
Discarded datum Unknown based on WGS84 ellipsoid in Proj4 definition
slope.can <- terrain(alt.can[[1]], opt='slope') # only first layer (country level)
aspect.can <- terrain(alt.can[[1]], opt='aspect')
# combine layers
hill.usa <- hillShade(slope.usa, aspect.usa, angle = 40, direction = 270)
hill.can <- hillShade(slope.can, aspect.can, angle = 40, direction = 270)
hill.mex <- hillShade(slope.mex, aspect.mex, angle = 40, direction = 270)
# Combine USA, Canada, Mexico data
hill.na<-merge(hill.usa, hill.can, hill.mex)
## Read in OUR data for collection localities
samples<-read.csv("latlon.csv")
## Use dplyr to subset based on taxon
stri<-samples %>% filter(tax == "stri")
vree<-samples %>% filter(tax == "vree")
snv<-samples %>% filter(tax == "snv")
cra<-samples %>% filter(tax == "cra")
## plot the points
# Plot the base map
plot(hill.na, col=grey(0:100/100), xlab="Latitude", ylab="Longitude", cex=2.0, legend=FALSE, xlim = c(-135, -50), ylim = c(15, 60)) +
## for the C striata GBIF records
points(all$lon, all$lat, pch = 21, col = "black", cex = 1.5)
integer(0)
## For our collections
points(stri$lon, stri$lat, pch = 19, col = "red", cex = 1.5)
points(vree$lon, vree$lat, pch = 19, col = "green", cex = 1.5)
points(snv$lon, snv$lat, pch = 19, col = "blue", cex = 1.5)
points(cra$lon, cra$lat, pch = 19, col = "magenta", cex = 1.5)

### add custom legend ####
legend("bottomright", legend=c("Corallorhiza striata, no variety listed", "Corallorhiza striata var. striata", "Corallorhiza striata var. vreelandii", "Corallorhiza striata Sierra Nevada", "Corallorhiza striata Coast Ranges/Cascades"), col=c("black", "red", "green", "blue", "magenta"), pch=16, cex=0.8, pt.cex=2.0, inset=0.02)
Error in strwidth(legend, units = "user", cex = cex, font = text.font) :
plot.new has not been called yet
LS0tDQp0aXRsZTogIk1ha2luZyBmYW5jeSByZWxpZWYgbWFwcyB3aXRoIEdCSUYgcmVjb3JkcyBhbmQgc2FtcGxpbmcgbG9jYWxpdGllcyBmb3IgYSByYW5nZXdpZGUgcG9wdWxhdGlvbiBnZW5vbWljcyBwcm9qZWN0Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KQ3JhaWcgRi4gQmFycmV0dA0KRGVwYXJ0bWVudCBvZiBCaW9sb2d5DQpXZXN0IFZpcmdpbmlhIFVuaXZlcnNpdHkNCg0KVGhpcyBjb2RlIHNob3dzIHlvdSBob3cgZ2VuZXJhdGUgZmFuY3kgcmVsaWVmIG1hcHMsIGdhdGhlciBvY2N1cnJlbmNlIGRhdGEgZnJvbSBHQklGLCBhbmQgaW5jbHVkZSBhIC5jc3YgZmlsZSBvZiBsYXRpdHVkZXMsIGxvbmdpdHVkZXMsIGFuZCB0YXhhDQoNCmUuZy4gSGVyZSBpcyB3aGF0IHRoZSBDU1YgZmlsZSB3aXRoIGNvbGxlY3Rpb25zIGluZm9yIGxvb2tzIGxpa2U6DQoNCmFjY2Vzc2lvbiB8IHRheCB8IGxvbiB8IGxhdA0KLS0tLS0tLS0tIHwgLS0tLSB8IC0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tDQoxMDNhX05NICAgfCB2cmVlIHwgLTEwNS43NDgxNjY3IHwgMzIuOTQyODMzMzMNCjEwM2FfTk0gICB8IHZyZWUgfCAtMTA1Ljc0ODE2NjcgfCAzMi45NDI4MzMzMw0KMTAzYV9OTSAgIHwgdnJlZSB8IC0xMDUuNzQ4MTY2NyB8IDMyLjk0MjgzMzMzDQpldGMgICAgICAgfCBldGMgIHwgZXRjICAgICAgICAgIHwgZXRjDQoNCmBgYHtyfQ0KIyMjIEdldCBhcHByb3ByaWF0ZSBsaWJyYXJpZXMNCg0KIyBpZiBuZWVkZWQsIGluc3RhbGwucGFja2FnZXMoYygicmFzdGVyIiwiZGlzbW8iLCJyZ2JpZiIsImRwbHlyIikpDQoNCmxpYnJhcnkoInJhc3RlciIpICMgZm9yIGRvd25sb2FkaW5nIHJlbGllZiBtYXAgZGF0YQ0KbGlicmFyeSgiZGlzbW8iKSAjIGZvciBkb3dubG9hZGluZyBnYmlmIGRhdGEgLS0gYXBwcm9hY2ggMQ0KbGlicmFyeSgicmdiaWYiKSAjIGZvciBkb3dubG9hZGluZyBnYmlmIGRhdGEgLS0gYXBwcm9hY2ggMg0KbGlicmFyeSgiZHBseXIiKSAgICMgZm9yIHN1YnNldHRpbmcgdGhlIGRhdGEgYnkgdGF4b24NCmBgYA0KYGBge3J9DQojIyMgR2V0IGRhdGEgZm9yIGVhY2ggc3BlY2llcyB3aXRoICJkaXNtbyIgcGFja2FnZQ0KDQphbGw8LWdiaWYoIkNvcmFsbG9yaGl6YSBzdHJpYXRhIikNCnN0cjwtZ2JpZigiQ29yYWxsb3JoaXphIHN0cmlhdGEgdmFyLiBzdHJpYXRhIikNCnZyZWU8LWdiaWYoIkNvcmFsbG9yaGl6YSBzdHJpYXRhIHZhci4gdnJlZWxhbmRpaSIpDQppbnY8LWdiaWYoIkNvcmFsbG9yaGl6YSBzdHJpYXRhIHZhci4gaW52b2x1dGEiKQ0KYmVuPC1nYmlmKCJDb3JhbGxvcmhpemEgYmVudGxleWkiKQ0KYGBgDQpgYGB7cn0NCiMgR2V0IGFsdGl0dWRlLCBzcG9sZSwgYW5kIGFzcGVjdCBsYXllcnMNCmFsdC51c2EgPC0gZ2V0RGF0YSgnYWx0JywgY291bnRyeSA9IGMoIlVTQSIpLCBsZXZlbCA9IDEpDQpzbG9wZS51c2EgPC0gdGVycmFpbihhbHQudXNhW1sxXV0sIG9wdD0nc2xvcGUnKSAjIG9ubHkgZmlyc3QgbGF5ZXIgKGNvdW50cnkgbGV2ZWwpDQphc3BlY3QudXNhIDwtIHRlcnJhaW4oYWx0LnVzYVtbMV1dLCBvcHQ9J2FzcGVjdCcpDQoNCmFsdC5tZXggPC0gZ2V0RGF0YSgnYWx0JywgY291bnRyeSA9IGMoIk1leGljbyIpLCBsZXZlbCA9IDEpDQpzbG9wZS5tZXggPC0gdGVycmFpbihhbHQubWV4W1sxXV0sIG9wdD0nc2xvcGUnKSAjIG9ubHkgZmlyc3QgbGF5ZXIgKGNvdW50cnkgbGV2ZWwpDQphc3BlY3QubWV4IDwtIHRlcnJhaW4oYWx0Lm1leFtbMV1dLCBvcHQ9J2FzcGVjdCcpDQoNCmFsdC5jYW4gPC0gZ2V0RGF0YSgnYWx0JywgY291bnRyeSA9IGMoIkNhbmFkYSIpLCBsZXZlbCA9IDEpDQpzbG9wZS5jYW4gPC0gdGVycmFpbihhbHQuY2FuW1sxXV0sIG9wdD0nc2xvcGUnKSAjIG9ubHkgZmlyc3QgbGF5ZXIgKGNvdW50cnkgbGV2ZWwpDQphc3BlY3QuY2FuIDwtIHRlcnJhaW4oYWx0LmNhbltbMV1dLCBvcHQ9J2FzcGVjdCcpDQpgYGANCmBgYHtyfQ0KIyBjb21iaW5lIGxheWVycw0KaGlsbC51c2EgPC0gaGlsbFNoYWRlKHNsb3BlLnVzYSwgYXNwZWN0LnVzYSwgYW5nbGUgPSA0MCwgZGlyZWN0aW9uID0gMjcwKQ0KaGlsbC5jYW4gPC0gaGlsbFNoYWRlKHNsb3BlLmNhbiwgYXNwZWN0LmNhbiwgYW5nbGUgPSA0MCwgZGlyZWN0aW9uID0gMjcwKQ0KaGlsbC5tZXggPC0gaGlsbFNoYWRlKHNsb3BlLm1leCwgYXNwZWN0Lm1leCwgYW5nbGUgPSA0MCwgZGlyZWN0aW9uID0gMjcwKQ0KDQojIENvbWJpbmUgVVNBLCBDYW5hZGEsIE1leGljbyBkYXRhDQpoaWxsLm5hPC1tZXJnZShoaWxsLnVzYSwgaGlsbC5jYW4sIGhpbGwubWV4KQ0KYGBgDQpgYGB7cn0NCiMjIFJlYWQgaW4gT1VSIGRhdGEgZm9yIGNvbGxlY3Rpb24gbG9jYWxpdGllcw0Kc2FtcGxlczwtcmVhZC5jc3YoImxhdGxvbi5jc3YiKQ0KDQojIyBVc2UgZHBseXIgdG8gc3Vic2V0IGJhc2VkIG9uIHRheG9uDQpzdHJpPC1zYW1wbGVzICU+JSBmaWx0ZXIodGF4ID09ICJzdHJpIikNCnZyZWU8LXNhbXBsZXMgJT4lIGZpbHRlcih0YXggPT0gInZyZWUiKQ0Kc252PC1zYW1wbGVzICU+JSBmaWx0ZXIodGF4ID09ICJzbnYiKQ0KY3JhPC1zYW1wbGVzICU+JSBmaWx0ZXIodGF4ID09ICJjcmEiKQ0KYGBgDQpgYGB7cn0NCiMjIHBsb3QgdGhlIHBvaW50cw0KIyBQbG90IHRoZSBiYXNlIG1hcA0KcGxvdChoaWxsLm5hLCBjb2w9Z3JleSgwOjEwMC8xMDApLCB4bGFiPSJMYXRpdHVkZSIsIHlsYWI9IkxvbmdpdHVkZSIsIGNleD0yLjAsIGxlZ2VuZD1GQUxTRSwgeGxpbSA9IGMoLTEzNSwgLTUwKSwgeWxpbSA9IGMoMTUsIDYwKSkgKw0KIyMgZm9yIHRoZSBDIHN0cmlhdGEgR0JJRiByZWNvcmRzDQpwb2ludHMoYWxsJGxvbiwgYWxsJGxhdCwgcGNoID0gMjEsIGNvbCA9ICJibGFjayIsIGNleCA9IDEuNSkNCg0KIyMgRm9yIG91ciBjb2xsZWN0aW9ucw0KcG9pbnRzKHN0cmkkbG9uLCBzdHJpJGxhdCwgcGNoID0gMTksIGNvbCA9ICJyZWQiLCBjZXggPSAxLjUpDQpwb2ludHModnJlZSRsb24sIHZyZWUkbGF0LCBwY2ggPSAxOSwgY29sID0gImdyZWVuIiwgY2V4ID0gMS41KQ0KcG9pbnRzKHNudiRsb24sIHNudiRsYXQsIHBjaCA9IDE5LCBjb2wgPSAiYmx1ZSIsIGNleCA9IDEuNSkNCnBvaW50cyhjcmEkbG9uLCBjcmEkbGF0LCBwY2ggPSAxOSwgY29sID0gIm1hZ2VudGEiLCBjZXggPSAxLjUpDQpgYGANCmBgYHtyfQ0KIyMjIGFkZCBjdXN0b20gbGVnZW5kICMjIyMNCg0KbGVnZW5kKCJib3R0b21yaWdodCIsIGxlZ2VuZD1jKCJDb3JhbGxvcmhpemEgc3RyaWF0YSwgbm8gdmFyaWV0eSBsaXN0ZWQiLCAiQ29yYWxsb3JoaXphIHN0cmlhdGEgdmFyLiBzdHJpYXRhIiwgIkNvcmFsbG9yaGl6YSBzdHJpYXRhIHZhci4gdnJlZWxhbmRpaSIsICJDb3JhbGxvcmhpemEgc3RyaWF0YSBTaWVycmEgTmV2YWRhIiwgIkNvcmFsbG9yaGl6YSBzdHJpYXRhIENvYXN0IFJhbmdlcy9DYXNjYWRlcyIpLCBjb2w9YygiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgImJsdWUiLCAibWFnZW50YSIpLCBwY2g9MTYsIGNleD0wLjgsIHB0LmNleD0yLjAsIGluc2V0PTAuMDIpDQpgYGANCg0KDQoNCg0KDQoNCg0K