在 R 的 ggplot2 中保留 NA 值

Keep NA values in ggplot2 in R

我认为这很容易...但找不到解决方案。 我正在尝试在 R 中生成一个 ggplot2,其中 col1 和 col2 之间存在相关性,点的大小与 col3 相关,形状与 col4 相关。 col3 和 col4 有 NA/missing 个值。当 运行 下面的代码时,ggplot2 删除没有匹配的 col3 and/or col4 的行,但是,我想保留这些和颜色代码。输出低于

示例数据框:

警告: 删除了包含缺失值的 3 行 (geom_point)。

  1. 我试图用 is.na(df$col3 | df$col4) 创建另一个 geom_point 但那行不通。
  2. 尝试在
  3. 中添加na.rm=FALSE
geom_point(aes(size=df$col3, col=df$col4), na.rm=FALSE)

  1. 尝试过
scale_size(range = c(0.25,4), na.value = 0) #to give a 0 value to the na.value (although would rather not)

但是,对于#2 和#3,我以“忽略未知美学:na.rm”结束,而#1 给出了错误。 此外,这并不能解决 col4 形状也被删除的问题

ggplot(df, aes(x=df$col1, y=df$col2)) + 
    geom_point(aes(size=df$col3, col=df$col4), na.rm=FALSE) + 
    theme_classic() + 
    scale_size(range = c(0.25,4)) 
             
+-------------+-------------+-------------+----------+
|    col1     |    col2     |    col3     |   col4   |
+-------------+-------------+-------------+----------+
| 0.254393811 | 0.124242905 | NA          | NA       |
|  0.28223149 | 0.148601748 | 0.236953099 | CD8CTL   |
| 0.205945835 | 0.074541695 | NA          | NA       |
| 0.199758631 | 0.103369485 | NA          | CD8Mem   |
|   0.2798128 | 0.109511863 | 0.396113132 | CD8STAT1 |
| 0.254616042 | 0.059495241 | 0.479590212 | CD8CTL   |
| 0.197929395 |  0.10993698 | 0.272611442 | CD8CTL   |
| 0.294888359 |  0.12319682 | 0.16069263  | CD8CTL   |
| 0.191407446 | 0.086443936 | 0.36596486  | CD8CTL   |
| 0.267533392 |  0.11240525 | 0.344659516 | CD8CTL   |
+-------------+-------------+-------------+----------+

请查看以下链接:

http://naniar.njtierney.com/reference/geom_miss_point.html

顺便说一下,你的解释很清楚你想要达到的目标。我看到问题将与当 Col3 和 Col4 中没有值时使用哪种形状和颜色有关。也许尝试这样解决它,比如

当Col3和Col4中有NAN时,Col1和Col2相关的颜色和形状是这样的。

另一个测试是使用 geom_miss_point

有几点需要注意 - 我想我已经理解了 OP 在这里想要做什么。在这种情况下,您希望绘制所有点。我要说明我们希望情节看起来如何:

  • col1用于绘制x轴
  • col2用于绘制y轴
  • col3用来控制大小的点
  • col4用于控制点颜色

我们在 col3col4 中有 NA 个值。那该怎么办呢?好吧,对于颜色,我将标记那些并将它们包含在图例中颜色编码并标记为“NA”。尺寸呢?好吧,size=NA 没有任何意义,所以我认为为 df$col3 == NA 做的最好的事情就是改变形状。这是我所做的:

ggplot(df, aes(x=col1, y=col2, color=col4)) +
  geom_point(aes(size=col3, shape='Not NA')) +
  geom_point(data=subset(df, is.na(col3)), aes(shape='NA'), size=3) +
  scale_shape_manual(values=c('NA'=3, 'Not NA'=19)) +
  theme_classic()

首先,通过 data.frame$column.name 引用列是一种错误的形式 - 您应该只使用列名本身。

颜色很简单 - 我们只是将 color=col4 放在顶部 aes() 规范中,因为它适用于每个几何体。

对于形状,这里可能最简单的方法是在对 geom_point() 的两次单独调用中指定。一种是没有任何规范,它自然会删除任何 NAs - 你不会得到用 size=NA 绘制的点。要“重新添加”NA 点,我们必须专门将它们拉出并指定一个大小。最后,为了使图例内部的形状美观,我们需要将其放在 aes() 内。这里的一般规则是,如果您将美学设置为 aes() 内的列名,它将使用该列内的值进行标记。如果您只是像我们在这里所做的那样在 aes() 中键入一个字符,您将在该 geom 调用中的所有项目都标有该字符 - 但图例已创建。因此,我们基本上是在此处为 shape 创建我们自己的自定义图例。

那么只需要使用 scale_shape_manual()values 参数的命名向量来设置我们想要使用的实际形状。

编辑

再考虑一下,NA 出现在颜色和形状的图例中没有意义,所以让我们将其从颜色中删除。这是通过将 col3 中包含 NA 的数据集与不包含 NA 的数据集完全分离来完成的:

ggplot(df, aes(x=col1, y=col2, color=col4)) +
  geom_point(data=subset(df, !is.na(col3)), aes(size=col3, shape='Not NA')) +
  geom_point(data=subset(df, is.na(col3)), aes(shape='NA'), size=3) +
  scale_shape_manual(values=c('NA'=3, 'Not NA'=19)) +
  theme_classic()