R:有没有办法在 ggplot 图例中添加未使用的数据级别?

Jel*_*eRo 0 r spatial ggplot2

我正在尝试使用 ggplot 在我用颜色编码的从 0 到 4 的因子类型向量上呈现一个地图。该向量位于我命名的数据框中spat.dataframe,向量为qt

在此输入图像描述

# plot
ggplot(spat.dataframe, aes(long,lat,group=group)) + # the data
  geom_polygon(aes(fill=as.factor(qt))) + # make polygons
  scale_fill_manual(values = c("0"="#F0F0F0","1"="green","2"="red","3"="blue","4"="purple"),
                    labels = c(paste0("white (",length(spat.dataframe[spat.dataframe$qt==0,]),")"),
                                 paste0("green (",length(spat.dataframe[spat.dataframe$qt==1,]),")"),
                                 paste0("red (",length(spat.dataframe[spat.dataframe$qt==2,]),")"),
                                 paste0("blue (",length(spat.dataframe[spat.dataframe$qt==3,]),")"),
                                 paste0("pink (",length(spat.dataframe[spat.dataframe$qt==4,]),")")),
                      drop=F,
                      name=NULL) +
  theme(line = element_blank(),  # remove the background, tickmarks, etc
          axis.text = element_blank(),
          axis.title = element_blank(),
          panel.background = element_blank()) +
  ggtitle(title) + 
  geom_path( colour = "#6b6b6b", size = .5 ) +
  coord_equal() 
Run Code Online (Sandbox Code Playgroud)

我的问题在于图例部分,因为我想要做的是显示所有图例选项,即使矢量中没有列出任何图例选项。所以颜色值也是蓝色和紫色的。尝试起来可能有点困难,但我希望它出现在我的图形上,以便我还可以显示可能的值的数量以及与该值关联的多边形的数量。因此,对于我的向量 中的值 3 和 4 qt,两者都为零(即blue (0)purple (0))。

任何建议将不胜感激。谢谢。

Zac*_*ach 5

这是一个工作示例mtcars,取自此处的ggplot2文档。也就是说,您可以使用with参数来代替。scale_color_manuallimits

在下面的评论后编辑:limits参数是重要的,你可以将它传递给scale_color_manualscale_fill_manual

cols <- c("8" = "red","4" = "blue","6" = "darkgreen", "10" = "orange")
plot <- ggplot(mtcars, aes(x = mpg, y = wt, colour = factor(cyl))) + geom_point()
plot + scale_color_manual(values = cols,
                          limits = c("4", "6", "8", "10"),
                          labels = c("this", "is", "my", "test"))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这应该足以让您适应您的问题。对我来说,在没有实际数据集的情况下很难确定这是否有效,但这里有一个应该有效的解决方案:

cols= c("0"="#F0F0F0","1"="green","2"="red","3"="blue","4"="purple")

ggplot(spat.dataframe, aes(long,lat,group=group)) + # the data
  geom_polygon(aes(fill=as.factor(qt))) + # make polygons
  scale_fill_manual(limits = c("0", "1", "2", "3", "4")
                    values = cols,
                    labels = c(paste0("white (",length(spat.dataframe[spat.dataframe$qt==0,]),")"),
                               paste0("green (",length(spat.dataframe[spat.dataframe$qt==1,]),")"),
                               paste0("red (",length(spat.dataframe[spat.dataframe$qt==2,]),")"),
                               paste0("blue (",length(spat.dataframe[spat.dataframe$qt==3,]),")"),
                               paste0("pink (",length(spat.dataframe[spat.dataframe$qt==4,]),")")),
                     drop=F,
                     name=NULL) +
  theme(line = element_blank(),  # remove the background, tickmarks, etc
    axis.text = element_blank(),
    axis.title = element_blank(),
    panel.background = element_blank()) +
  ggtitle(title) + 
  geom_path( colour = "#6b6b6b", size = .5 ) +
  coord_equal() 
Run Code Online (Sandbox Code Playgroud)