在 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)。
- 我试图用 is.na(df$col3 | df$col4) 创建另一个 geom_point 但那行不通。
- 尝试在
中添加na.rm=FALSE
geom_point(aes(size=df$col3, col=df$col4), na.rm=FALSE)
- 尝试过
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
用于控制点颜色
我们在 col3
和 col4
中有 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()
的两次单独调用中指定。一种是没有任何规范,它自然会删除任何 NA
s - 你不会得到用 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()
我认为这很容易...但找不到解决方案。 我正在尝试在 R 中生成一个 ggplot2,其中 col1 和 col2 之间存在相关性,点的大小与 col3 相关,形状与 col4 相关。 col3 和 col4 有 NA/missing 个值。当 运行 下面的代码时,ggplot2 删除没有匹配的 col3 and/or col4 的行,但是,我想保留这些和颜色代码。输出低于
示例数据框:
警告: 删除了包含缺失值的 3 行 (geom_point)。
- 我试图用 is.na(df$col3 | df$col4) 创建另一个 geom_point 但那行不通。
- 尝试在 中添加na.rm=FALSE
geom_point(aes(size=df$col3, col=df$col4), na.rm=FALSE)
- 尝试过
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
用于控制点颜色
我们在 col3
和 col4
中有 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()
的两次单独调用中指定。一种是没有任何规范,它自然会删除任何 NA
s - 你不会得到用 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()