As the ever growing R package environment can be a rough terrain to navigate and find the appropriate tools to achieve one's goals, this vignette is meant to point out some ways to overcome initial problems with visualizing neutral landscape models or more general raster data. This is probably a heavily biased view on packages and functions and I am sure there are other good R packages out there to achieve the same (if so - feel free to point that out to me and I will include it!). However, I am also sure this collection can at least be a kickstart for quickly visualizing your results and help you to communicate them.
landscapetools function show_landscape
was developed to help users to adhere to
some standards concerning color scales and typography. This means for example
that by default the viridis color scale
is applied which makes your plots easier to read by those with colorblindness.
library("NLMR") library("landscapetools") landscape <- nlm_mosaictess(200, 200, germs = 444) # default theme show_landscape(landscape)
# ... chose another color scale from viridis ("E" = cividis) show_landscape(landscape, viridis_scale = "E")
# ... chose any other scale: # show_landscape returns a ggplot2 object, so you can follow your usual ggplot2 # workflow and change the color, axis labels, ... library(ggplot2) library(pals) show_landscape(landscape) + scale_fill_gradientn(colours=pals::parula(100)) + # parula color scale theme_void() + # minimal theme guides(fill = FALSE) # remove legend
rasterVis also offers some convenience functions to plot raster, for example:
library("NLMR") library("rasterVis") landscape <- nlm_mosaictess(200, 200, germs = 444) levelplot(landscape, , margin = FALSE)
Another nice function from rasterVis is gplot()
, a wrapper to use ggplot2
with raster data without reshaping your data as long data.frame:
library("NLMR") library("rasterVis") landscape <- nlm_mosaictess(200, 200, germs = 444) gplot(landscape) + geom_tile(aes(fill = value)) + coord_equal()
If you want to start from scratch with ggplot2:
library("NLMR") library("raster") library("ggplot2") landscape <- nlm_mosaictess(200, 200, germs = 444) # transform to long format for ggplot2 landscape_long <- as.data.frame(landscape, xy = TRUE) # plot with ggplot2 ggplot(landscape_long, aes(x,y)) + geom_tile(aes(fill = layer)) + coord_equal()
... if you are in a lot of hurry, raster itself also has a plot method for raster:
library("NLMR") library("raster") landscape <- nlm_mosaictess(200, 200, germs = 444) plot(landscape)
library("raster") library("NLMR") landscape <- nlm_fbm(ncol = 50, nrow = 50, fract_dim = 1.3)
## 'RandomFields' will NOT use OMP ## The package 'RandomFieldsUtils' has been compiled without appropriate SIMD/AVX2 flags. So, calculations can be slow. If the package is recompiled with the necessary flags, the calculations might be faster. ## R should be restarted after re-compiling. The argument 'install.control' might be used to run the re-compilation without asking and to pass further arguments to 'install.packages', e.g., 'RFoptions(install.control=list(verbose=TRUE))' ## To avoid this feedback, set 'RFoptions(install="no")' or 'RFoptions(install="install")' before calling any other function of 'RandomFieldsUtils'. ## ## RandomFieldsUtils sees SSE2, but not GPU, AVX2, AVX,OMP. ## ## ## Or call 'RFoptions(install="no")' after loading to avoid being asked again. ## Searching for tar balls... ## The following package will be re-installed: ## RandomFieldsUtils_1.1.0 from cran
persp(landscape, exp=0.5, maxpixels = 5000, theta = 125, phi=45, xlab="Longitude", ylab="Latitude", zlab="Z", shade = 0.45)
library("NLMR") library("rasterVis") landscape <- nlm_mpd(ncol = 50, nrow = 50, roughness = 0.6) contourplot(landscape, pretty = TRUE)
levelplot(landscape, contour = TRUE, pretty = TRUE)
library("rgl") library("rasterVis") library("viridis") library("NLMR") landscape <- nlm_mpd(ncol = 100, nrow = 100, roughness = 0.6) plot3D(landscape, zfac=2, lit=FALSE, col=colorRampPalette(magma(11))) rglwidget()
library("highcharter") library("magrittr") library("plotly") library("NLMR") # create a NLM to work with landscape <- nlm_mosaicfield(ncol = 100, nrow = 100, n = 20) # coerce to matrix landscape_matrix <- raster::as.matrix(landscape) # plot interactive graph hchart(landscape_matrix) %>% # changing default color hc_colorAxis(stops = color_stops(colors = viridis::inferno(10))) %>% hc_exporting( enabled = TRUE )
# With plotly we can combine the interactive approach with the 3D Visualization plot_ly(z = as.matrix(landscape_matrix), type = "surface", colors = viridis::magma(8))
library(rayshader) library(NLMR) library(raster) library(rgl) set.seed(123) landscape <- nlm_mpd(1000, 1000, roughness = 0.6, rescale = FALSE) * 500 landscape <- raster::focal(landscape, w=matrix(1, 31, 31), mean, pad = TRUE, padValue=0) landscape <- raster::as.matrix(landscape) shadow = ray_shade(landscape, zscale=1, lambert=FALSE) amb = ambient_shade(landscape, zscale=1, sunbreaks = 15, maxsearch = 100) landscape %>% sphere_shade(zscale=5,texture = "imhof1") %>% add_water(detect_water(landscape, min_area = 4000)) %>% add_shadow(shadow,0.7) %>% add_shadow(amb) %>% add_shadow(lamb_shade(landscape)) %>% plot_3d(landscape, zscale=5, fov=0, theta=-45, phi=45, windowsize=c(1200,1200), zoom=1.2, water=TRUE, wateralpha = 0.8, watercolor = "lightblue", waterlinecolor = "white", waterlinealpha = 0.3, solid = FALSE)
library(rayshader) library(NLMR) library(raster) library(rgl) set.seed(123) landscape <- nlm_mpd(1000, 1000, roughness = 0.6, rescale = FALSE) * 500 landscape <- raster::focal(landscape, w=matrix(1, 31, 31), mean, pad = TRUE, padValue=0) landscape <- raster::as.matrix(landscape) shadow = ray_shade(landscape, zscale=1, lambert=FALSE) amb = ambient_shade(landscape, zscale=1, sunbreaks = 15, maxsearch = 100) landscape %>% sphere_shade(zscale=5,texture = "imhof1") %>% add_water(detect_water(landscape, min_area = 4000)) %>% add_shadow(shadow,0.7) %>% add_shadow(amb) %>% add_shadow(lamb_shade(landscape)) %>% plot_3d(landscape, zscale = 5, fov = 0, theta = -45, phi = 45, windowsize = c(1200, 1200), zoom = 1.2, water = TRUE, wateralpha = 0.8, watercolor = "lightblue", waterlinecolor = "white", waterlinealpha = 0.3, solid = TRUE, solidcolor = "grey75") render_depth( focallength = 30, fstop = 2, bokehshape = "hex", bokehintensity = 5, progbar = FALSE )
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.