studio - superponer graficas en r
Superponer un mapa sobre un mapa de superficie 3d en r (1)
He creado un mapa en 3D usando rgl.surface (), principalmente siguiendo la respuesta de Shane en this publicación. Usando mis propios datos, obtengo este mapa.
En la parte superior de este mapa de superficie, me gustaría agregar un mapa de densidad de vegetación tal que obtenga algo como esto (obtenido con el software Surfer):
¿Es posible hacer esto con rgl, o para el caso cualquier otro paquete en r o es la única solución para tener dos mapas como en la respuesta de Shane?
Gracias.
Editar:
Siguiendo la solicitud de @gsk3, aquí está el código para este mapa:
library(rgl)
# Read the z (i.e. elevation) dimension from file
z1 = matrix(scan("myfile.txt"),nrow=256, ncol=256, byrow=TRUE)
#create / open x y (i.e. easting and northing coordinates) dimensions
y=8*(1:ncol(z)) # Each point is 8 m^2
x=8*(1:nrow(z))
# See https://stackoverflow.com/questions/1896419/plotting-a-3d-surface-plot-with-contour-map-overlay-using-r for details of code below
zlim <- range(z)
zlen <- zlim[2] - zlim[1] + 1
colorlut <- terrain.colors(zlen,alpha=0) # height color lookup table
col <- colorlut[ z-zlim[1]+1 ] # assign colors to heights for each point
open3d()
rgl.surface(x,y,z)
No puedo publicar el código de elevación porque hay 65536 (es decir, x * y = 256 * 256) puntos, pero es una matriz que se ve así.
[,1] [,2] [,3] [,4] [,5]
[1,] 1513.708 1513.971 1514.067 1513.971 1513.875
[2,] 1513.622 1513.524 1513.578 1513.577 1513.481
y así. Lo mismo para el mapa de densidad de vegetación, que es exactamente el mismo formato y para el que tengo un solo valor para cada punto x * y. Espero que esto haga las cosas un poco más claras ...?
Edición 2, versión final.
Este es el mapa que he producido con R. Todavía no tengo la leyenda, pero es algo que haré en una etapa posterior.
El código final para esto es
library(rgl)
z1 = matrix(scan("myfile.txt"),nrow=256, ncol=256, byrow=TRUE)
# Multiply z by 2 to accentuate the relief otherwise it looks a little bit flat.
z= z1*2
#create / open x y dimensions
y=8*(1:ncol(z))
x=8*(1:nrow(z))
trn = matrix(scan("myfile.txt"),nrow=256, ncol=256, byrow=TRUE)
fv = trn*100
trnlim = range(fv)
fv.colors = colorRampPalette(c("white","tan4","darkseagreen1","chartreuse4")) ## define the color ramp
colorlut =fv.colors(100)c(1,seq(35,35,length.out=9),seq(35,75,length.out=30),seq(75,100,length.out=61))]
# Assign colors to fv for each point
col = colorlut[fv-trnlim[1]+1 ]
open3d()
rgl.surface(x,y,z,color=col)
Muchas gracias a @gsk3 y @nullglob en this post por su ayuda. Espero que esta publicación ayude a muchos otros!
Modificado el código anterior para dar una respuesta. Tenga en cuenta que el terreno debe ser una matriz en el mismo formato que la matriz de elevación. Y agregué un argumento de ,color
a tu llamada de función para que realmente use la matriz de color que creaste.
library(rgl)
# Read the z (i.e. elevation) dimension from file
z1 = matrix(scan("myfile.txt"),nrow=256, ncol=256, byrow=TRUE)
#create / open x y (i.e. easting and northing coordinates) dimensions
y=8*(1:ncol(z)) # Each point is 8 m^2
x=8*(1:nrow(z))
# Read the terrain types from a file
trn = matrix(scan("terrain.txt"),nrow=256, ncol=256, byrow=TRUE)
# See http://.com/questions/1896419/plotting-a-3d-surface-plot-with-contour-map-overlay-using-r for details of code below
trnlim <- range(trn)
trnlen <- trnlim[2] - trnlim[1] + 1
colorlut <- terrain.colors(trnlen,alpha=0) # height color lookup table
col <- colorlut[ trn-trnlim[1]+1 ] # assign colors to heights for each point
open3d()
rgl.surface(x,y,z,color=col)