在地块和大小中包括NA值,填充图例

时间:2018-07-12 16:24:52

标签: r ggplot2 legend na

我在数据集中有NA值,我希望将其包括在ggplot和图例中。我认为可以通过指定na.values="somecolour"选项来轻松完成此操作,例如在this帖子中。但是,对于我的示例,该代码在运行时未绘制任何NA,也未在图例中包含任何条目。而是会自动删除缺少值的行。这是一些说明性代码:

set.seed(42)  
lat <- rnorm(10, 54, 12)
long <- rnorm(10, 44, 12)
val <- rnorm(6, 10, 3)
val <- c(val,NA,NA,NA,NA)

df <- as.data.frame(cbind(long, lat, val))

library(ggplot2)
library(scales)

ggplot() +
  geom_point(data=df, aes(x=lat, y=long, size=val, fill=val),shape=21,alpha=0.6) +
  scale_size_continuous(range = c(2, 12), breaks=pretty_breaks(4)) +
  scale_fill_distiller(direction = -1, palette="RdYlBu", breaks=pretty_breaks(4),na.value = "black") +     
  guides(fill = guide_legend(), size = guide_legend()) +
  theme_minimal()

我在做什么错?

1 个答案:

答案 0 :(得分:1)

问题来自在size中设置aes,因为您无法在NA中设置scale_size_continuous值的大小。

我的解决方案是分别绘制NA值(虽然不完美,但可以)。要将它们添加到图例中,请在aes中设置一些虚拟值以调用该指南。

但是,存在一个问题,即NA图例与非NA图例不能很好地对齐。要调整对齐方式,我们必须绘制另一组不可见的NA值,其大小为最大非NA值。

ggplot(df, aes(lat, long, size = val, fill = val)) +
    geom_point(shape = 21,alpha = 0.6) +
    geom_point(data = subset(df, is.na(val)), aes(shape = "NA"),
               size = 1, fill = "black") +
    geom_point(data = subset(df, is.na(val)), aes(shape = "NA"),
               size = 14, alpha = 0) +
    scale_size_continuous(range = c(2, 12), breaks = pretty_breaks(4)) +
    scale_fill_distiller(direction = -1, palette = "RdYlBu", breaks = pretty_breaks(4)) +     
    labs(shape = "         val\n",
         fill = NULL,
         size = NULL) +
    guides(fill = guide_legend(), 
           size = guide_legend(),
           shape = guide_legend(order = 1)) +
    theme_minimal() +
    theme(legend.spacing.y = unit(-0.4, "cm"))

enter image description here

PS:需要ggplot2_3.0.0