Tenho uma terra::rast()
pilha de dados contínuos, que classifico em n classes, converto em fatores e ploto em uma escala discreta.
Mas quando o primeiro raster não tem todos os fatores presentes que alguns dos outros rasters têm (por exemplo, apenas 3 valores de classificação em vez de todo o conjunto de 10, convertidos em fatores), o gráfico fica um pouco confuso.
Estou procurando uma maneira de informar à pilha rast (ou plot) que os níveis de toda a pilha são mínimo e máximo da pilha, mas algumas camadas podem ter menos.
Curiosamente, se a primeira camada tiver todas as classes/fatores possíveis, as subsequentes estarão ok e o gráfico estará bom.
# dummy data
library(terra)
r1 <- rast(nrows = 10, ncols = 10, xmin = 0, xmax = 10, ymin = 0, ymax = 10)
r1[] <- runif(ncell(r1), min = 1, max = 5) # Random values between 1 and 5
r2 <- rast(nrows = 10, ncols = 10, xmin = 0, xmax = 10, ymin = 0, ymax = 10)
r2[] <- runif(ncell(r2), min = 1, max = 5)
# Combine rasters into a stack
s <- c(r1/r1, r1/r2, r2/r1, r2/r2)
names(s) <- c("r1/r1", "r1/r2", "r2/r1", "r2/r2")
# Reclassify the raster stack
# Define reclassification matrix
m_rc <- matrix(c(0, 0.5, 1,
0.5, 0.9, 2,
0.9, 1.1, 3,
1.1, 2, 4,
2, max(global(s, max, na.rm=T)$max), 5),
ncol = 3, byrow = TRUE)
# Apply reclassification
s_r <- classify(s, m_rc)
# Convert reclassified raster to factor for categorical plotting
s_r_f <- as.factor(s_r)
# Step 3: Plot using ggplot2 and tidyterra with custom legend labels
ggplot() +
geom_spatraster(data = s_r_f) +
facet_wrap(~lyr, nrow = 2) + # Separate plots for each layer
scale_fill_manual(
values = c("blue","lightblue" , "white", "yellow", "red"), # Assign custom colors
na.value = "transparent", # Transparent for NA values
) +
labs(
title = "Reclassified Raster Stack",
labels = c("0 - 0.5","0.5 - 0.9","0.9 - 1.1","1.1 - 2","> 2"),
fill = "Class"
) +
theme_minimal()
Isso deve ser melhorado um pouco no pacote, mas agora você pode fazer isso:
Com a versão de desenvolvimento do terra (versão 1.8-9) agora você pode fazer
E para usar com tidyterra e ggplot você pode primeiro usar
combineLevels
Além da solução de Robert, que é perfeitamente boa, veja como isso pode ser controlado com algumas opções de
ggplot
(veja também ggplot2 stacked bar not order by manual-defined factor order ).Basicamente, dentro
scale_fill_manual
você pode atribuir manualmente a cor com um valor dado usando um par value-color invalues
e alterar o default oder usandobreaks
. Eu também recodifiquei os valores na legenda, pois presumi que essa era sua intenção com esta linha:Veja o reprex completo:
Trace a resposta de Robert para comparação (mesmo gráfico):
Criado em 2025-01-09 com reprex v2.1.1
Informações da sessão