【问题标题】:Keep NA values in ggplot2 in R在 R 中的 ggplot2 中保留 NA 值
【发布时间】:2021-07-12 05:57:07
【问题描述】:

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

示例数据框:

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

  1. 我尝试使用 is.na(df$col3 | df$col4) 创建另一个 geom_point,但这不起作用。
  2. 尝试添加 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   |
+-------------+-------------+-------------+----------+

【问题讨论】:

  • 完成。添加示例
  • 对于 col1 和 col2 具有值但对于 col3 和 col4 不具有值的点,您希望显示什么?你还希望这些出现在情节上吗?如果是这样……他们会被标记为 NA,对吧?
  • 是的。我希望所有 10 个点都出现
  • 但是您希望如何在图例中标记它们?你想让它们出现在传说中吗?
  • 不适用?任何类型的标签,只要不被移除。也许是灰色的?

标签: r ggplot2 na


【解决方案1】:

请查看以下链接:

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

Plotting missing values in ggplot2 with a separate line type

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

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

另一个测试是使用 geom_miss_point

【讨论】:

  • 感谢您的回复。我用输出和示例更新了问题。
【解决方案2】:

有几点需要注意 - 我想我已经理解 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()

【讨论】:

  • 感谢您的出色回复。我玩了一点,以尝试适应我更大的数据集。这行得通。但是,有几个问题需要澄清:
  • 感谢您的出色回复。我玩了一点,以尝试适应我更大的数据集。这行得通。但是,有几个问题需要澄清:1)shape =“Not NA”和“NA”令人困惑。那是R中的正则表达式吗?我知道 NA 没有引号。但我的数据中没有定义“Not NA”。 2) scale_shape_manual 是否只是编辑图例的形状大小? 3) 我在末尾添加了 scale_size(range = c(0.25,4)) 以减小点的大小(因为我有 10,000 行)。这对任何功能都是多余的吗?看起来不像。非常感谢。
  • shape = "Not NA" 不会被评估为逻辑表达式。它只是为整个数据集提供一个名称。考虑它的最佳方式是:通常shape = col1 将引用数据中列的名称,然后从该列数据中提取标签作为因子(或连续)。当您将其更改为shape = "col1" 时,它不会引用列,而是......在您的数据集中所有值都等于"col1" 的一种“创建另一个”。如果是这种情况并且您引用了那一列,那么您会将所有内容标记为“col1”。有点像..
  • scale_ 的两个函数都指定如何您希望ggplot 控制该比例。 aes() 部分指定如何将其映射出来,然后如果您不指定 scale_,它将猜测最佳区分方式。如果你想改变默认的形状、颜色等,你需要用一些scale_函数来指定。所以不是多余的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 2020-11-25
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多