ggplot 如何在 "mask" 切割后显示没有 NA 值的栅格?

ggplot How to display a raster without the NA values after a cut with "mask"?

使用 "mask" 函数根据多边形切割光栅后:

ras <- mask(ras0, polygon)

我想用 ggplot 显示栅格(link 下面)。但是,我对位于切割栅格外部的 "NA" 值有疑问。

https://depots.univ-perp.fr/get?k=9sh9zKXDpRTkVQslvJk

我在 "scale_fill_manual" 中添加了选项 na.value = "transparent" 以将 NA 值透明地显示在我的地图上,但 NA 的传说始终存在!

  1. 如何删除图例中的文本"NA"和对应的灰色方框?

  2. 在使用 "mask" 函数或使用 "Writeraster" 注册时,是否有解决方案可以明确删除 NA 值,以避免在使用 ggplot 显示时出现此问题?

这是用于显示地图的程序:

library(raster) 
ras<-raster("ras.tif")

# map
gplot(ras)+
  geom_tile(aes(fill=factor(value, labels=c("A", "B", "C", "D", "E", "F","G"))))+
  scale_fill_manual(values = c("red", "#22751a", "#48c665", "#d3d532", "#d78d0d", "#f6e600","#65d6ef"),
                    name= "Legend", na.value="transparent")+
  coord_cartesian(xlim = c(-7, 12),ylim = c(32, 38)) +
#bg
theme(panel.background = element_rect(colour = "black", fill="lightblue")) 

提前致谢

似乎 scale_fill_manual 在使用因子时显示 NA 值。定义您真正想要显示的因素的一种方法是使用其他参数 breakslabels 以及对应向量。如果我使用你的代码,这将是:

# Vector of correspondence
cols <- c("A" = "red", "B" = "#22751a", "C" = "#48c665",
          "D" = "#d3d532", "E" = "#d78d0d", "F" = "#f6e600","G" = "#65d6ef")

# plot
gplot(ras) +
geom_tile(aes(fill=factor(value, labels=c("A", "B", "C", "D", "E", "F","G"))))+
  scale_fill_manual(values = cols,
                    breaks = c("A", "B", "C", "D", "E", "F","G"),
                    labels = c("A", "B", "C", "D", "E", "F","G"),
                    name= "Legend") +
  coord_cartesian(xlim = c(-7, 12),ylim = c(32, 38)) +
theme(panel.background = element_rect(colour = "black", fill="lightblue")) 

但是,您可以以另一种方式使用它,同时将栅格的值(作为字符)直接归因于特定颜色,然后命名(我必须添加新颜色,因为栅格中有 8 个级别):

# Vector of correspondence
cols.nb <- c("0" = "blue", "1" = "red", "2" = "#22751a", "3" = "#48c665",
          "4" = "#d3d532", "5" = "#d78d0d", "6" = "#f6e600", 
          "7" = "#65d6ef")
# Plot
gplot(ras) +
geom_tile(aes(fill = as.character(value))) +
  scale_fill_manual(values = cols.nb,
                    breaks = 0:7,
                    labels = c("A", "B", "C", "D", "E", "F","G","H"),
                    name = "Legend") +
  coord_cartesian(xlim = c(-7, 12),ylim = c(32, 38)) +
theme(panel.background = element_rect(colour = "black", fill="lightblue"))