【问题标题】:Include NA values in plot and size, fill legend在绘图和大小中包含 NA 值,填充图例
【发布时间】:2018-12-20 23:18:57
【问题描述】:

我在数据集中有 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()

我做错了什么?

【问题讨论】:

    标签: r ggplot2 legend na


    【解决方案1】:

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

    我的解决方案是分别绘制 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"))
    

    PS:需要ggplot2_3.0.0

    【讨论】:

    • 感谢@PoGibas 的建议。但是,这或多或少是我开始的地方(请参阅我之前的问题here)。我的目标是将所有信息都放在一个图例中,但似乎 ggplot 并没有让这一切变得简单......
    • @M.Teich 有什么办法可以改进我目前的答案吗?
    猜你喜欢
    • 2013-03-08
    • 1970-01-01
    • 2020-03-18
    • 2018-11-24
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    相关资源
    最近更新 更多