3 votos

Mostrar gradiente de color bidimensional para dos cantidades diferentes

Tengo dos capas de trama superpuestas. Una contiene la cantidad A de 0 a 100, y la otra contiene la cantidad B de 0 a 100. Me gustaría crear un mapa que muestre ambos conjuntos de datos a la vez basado en una caja de color con dos ejes diferentes.

Por lo tanto, para un área donde:

  • A es 100 y B es 100, el mapa sería rojo
  • A es 100 y B es 0, sería amarillo
  • A es 0 y B es 100, sería verde
  • A es 0 y B es 0, sería azul

Para valores intermedios, el tono cambiaría en consecuencia, de modo que A=100, B=50 sería naranja; A=50, B=0 sería verde azulado.

He visto mapas que muestran este tipo de datos antes, y tengo un par de cosas que me gustaría mostrar de esta manera. ¿Cuál es la forma más sencilla de hacerlo? Puedo utilizar ArcGIS, QGIS y R.

3voto

Steve Puntos 11

Lo que intentas crear se conoce como mapa bivariante. Hay un par de maneras de hacer esto, pero como ya tienes datos raster que se inclina hacia ciertos métodos. La gran cosa va a ser sus selecciones de color, y no estoy seguro exactamente cómo conseguir la mezcla que usted desea.

Normalmente, esto se hace con dos colores, uno para cada variable. Así, A 0 = blanco, A 100 = azul, B 0 = blanco y B 100 = rojo. A continuación, se fusionan los dos raster y se obtienen tonos de morado donde ambos son altos, blanco donde ambos son bajos, y un color que se inclina hacia el rojo o el azul donde uno es mayor que el otro.

Esto puede adaptarse a dos ejes de color. A 0 es amarillo, A 100 es rojo y B 0 es verde con B 100 azul. Pero entonces usted puede comenzar a conseguir algunos valores confusos en el medio, dependiendo de sus colores. En este caso, A y B 100 es púrpura, mientras que A y B 0 es un verde amarillo. A 0 y B 100 va a ser gris, mientras que A 100 y B 0 es oliva.

Con sólo los tres primarios, las mezclas son bastante limpias. Sin embargo, el cuarto complica las cosas. Según tu pregunta, tanto A y B 0 sería azul, A 100 sería amarillo, B 100 es verde, y ambos A y B 100 es rojo. Esto no funciona, ya que amarillo más verde no es rojo. Y amarillo más el punto medio de verde y azul no es naranja.

Creo que obtendrás mejores resultados si eliges sólo dos colores. Incluso podrías salirte con la tuya con tres (ambos son del mismo color primario bajo o alto, pero luego cada uno tiene un primario diferente para el otro extremo de la gama). Pero el principio básico es el mismo. Usted simbolizará cada uno de sus rásteres con la rampa de color deseada, exportará/guardará eso a un ráster coloreado, luego fusionará/mezclará los dos rásteres coloreados para obtener su ráster bivariado final. Hay diferentes enfoques para fusionar/mezclar, y algunos programas ofrecen más opciones que otros. Por ejemplo, puede ser una mezcla de transparencias o una mezcla aditiva de colores.

Hay un método específico de ejemplo en esta pregunta usando gdal.

1voto

samuelkf Puntos 300

Si desea hacer esto en R, puede echar un vistazo a la herramienta entrada del blog por Oscar Perpiñán Lamigueiro. No es exactamente lo que está buscando, pero podría haber una manera de modificarlo para que funcione para sus propósitos.

En mi último post describí cómo producir un multivariante Ahora mostraré cómo crear un mapa a partir de archivos raster raster. Uno de ellos es un factor que agrupará los valores del del otro. Así, una vez más, voy a superponer varios grupos en el mismo mapa.

Adición:

Puede que sea un poco tarde, pero pensé en añadir esto ya que parece una solución relativamente sencilla a tu problema.

En R, cuando se utiliza plot() para visualizar rásters, existe un alpha que establece la transparencia. Si trazara sus dos variables como diferentes rásters de color con escalas de color que van de claro a oscuro y cada una alpha a un valor de 0,5, los colores se combinarán donde se solapen.

Lo he hecho con spatialPolygons utilizando spplot también. Imagino que funcionaría igual con los rasterizados. He aquí un ejemplo con spatialPolygons :

library(sp)
library(rgeos)
library(rworldmap)

box <- readWKT("POLYGON((-180 90, 180 90, 180 -90, -180 -90, -180 90))")
proj4string(box) <- CRS("+proj=cea +datum=WGS84")
set.seed(1)
pts <- spsample(box, n=2000, type="random")
pols <- gBuffer(pts, byid=TRUE, width=50) # create circle polys around each point
merge = sample(1:40, 100, replace = T) # create vector of rand #s between 0-100 to merge pols on

Sp.df <- gUnionCascaded(pols, id = merge) # combine polygons with the same 'merge' value
# create SPDF using polygons and randomly assigning 1 or 2 to each in the @data df
Sp.df <- SpatialPolygonsDataFrame(Sp.df, data.frame(z = factor(sample(1:2, length(Sp.df), replace = TRUE)),
                                                    row.names= unique(merge)))
Sp.df <- crop(Sp.df, box)
colors <- c(rgb(r=0, g=0, blue=220, alpha=50, max=255), rgb(r=220, g=0, b=0, alpha=50, max=255))

land <- getMap()

overlay.map <- spplot(Sp.df, zcol = "z", col.regions = colors, col = NA, alpha = 0.5, breaks=c(0,1)) +
  layer(sp.polygons(land, fill = "transparent",  col = "grey50"))

Obviamente, la leyenda no es muy útil para este mapa. Para crear una leyenda, hay que trazar los gradientes en un cuadrado, uno de izquierda a derecha y el otro de abajo arriba.

Aquí hay algo de código para hacer esto en gráficos base: https://stackoverflow.com/a/11103414/3897439 .

También lo hice para dos colores utilizando ggplot ya que necesitaba gráficos de cuadrícula. He aquí un ejemplo sencillo:

Variable_A <- 100 # max of variable
Variable_B <- 100

x <- melt(outer(1:Variable_A, 1:Variable_B)) # set up the data frame to plot from

p <- ggplot(x) + theme_classic() + scale_alpha(range=c(0,0.5), guide="none") +
  geom_tile(aes(x=Var1, y=Var2, fill="Variable_A", col.regions="red", alpha=Var1)) +
  geom_tile(aes(x=Var1, y=Var2, fill="Variable_B", col.regions="blue", alpha=Var2)) +
  scale_x_continuous(limits = c(0, Variable_A), expand = c(0, 0)) +
  scale_y_continuous(limits = c(0, Variable_B), expand = c(0, 0)) +
  xlab("Variable_A") + ylab("Variable_B") +
  guides(fill=FALSE)
p

No es perfecto, pero puede servir para tus propósitos.

Otra fuente que puede tener información interesante y relevante para su tarea es: http://andrewpwheeler.wordpress.com/2012/08/24/making-value-by-alpha-maps-with-arcmap/ .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X