Estoy tratando de trazar una categoría terra
con un color explícito para cada nivel, como se haría con un ráster de cobertura del suelo, pero con problemas cuando el ráster no tiene todos los niveles del factor.
Primero cree un ráster con valores numéricos de 1 a 10, hágalo categórico, y trace:
r2 = rast(matrix(1:10,2,5))
r2 = as.factor(r2)
levels(r2) = data.frame(value=1:10, desc=paste0("L",1:10))
plot(r2)
Genial, ahora quiero trazar con cada nivel impar coloreado de rojo y cada nivel par coloreado de azul, así que hago una paleta de longitud 10:
rb = rep(c("red","blue"),5)
plot(r2, col=rb)
Genial, pero supongamos que mi trama no tiene todos los niveles. Por ejemplo, hagamos una copia del raster y pongamos la primera celda en un nivel 2:
r2c = r2
r2c[1] = 2
plot(r2c, col=rb)
Y ahora los colores se han invertido y ya no se alterna con los niveles de 10 factores. El nivel 10 (azul) no es del mismo color que el nivel 8 (rojo).
Creo que lo que ocurre es que el color especifica colores para todos los valores que existe en la trama, no todos los valores que existen en los niveles. Así que si suelto el primer elemento de la paleta (porque ya no hay nivel 1 en la trama) obtengo esto:
plot(r2c, col=rb[-1])
que es lo que busco. Pero esto es un problema, porque significa que cada vez que tengo un mapa de color que contiene valores que no están en la trama (porque tal vez es un recorte de un conjunto más grande), tengo que subconjuntar la paleta de colores de acuerdo con los valores que todavía están presentes en la trama recortada. No encuentro una forma sencilla de decir que "L10" es "azul", y "L3" es "amarillo" y así sucesivamente. ¿O me lo he perdido?
Edición: la solución podría estar en coltab
pero creo que eso requiere hacer una paleta de colores completa de 255 filas. Se puede hacer, pero no está bien.