将ggplot2中的NA值保留在R中
我以为这会很容易。。。但找不到解决办法。 我试图在R中生成一个ggplot2,它与col1和col2之间有相关性,点的大小与col3有关,形状与col4有关。col3和col4具有NA/缺失值。运行下面的代码时,ggplot2会删除没有匹配col3和/或col4的行,但是,我希望保留这些行和颜色代码。输出低于 数据帧示例: 警告: 删除了包含缺失值的3行(几何点)将ggplot2中的NA值保留在R中,r,ggplot2,na,R,Ggplot2,Na,我以为这会很容易。。。但找不到解决办法。 我试图在R中生成一个ggplot2,它与col1和col2之间有相关性,点的大小与col3有关,形状与col4有关。col3和col4具有NA/缺失值。运行下面的代码时,ggplot2会删除没有匹配col3和/或col4的行,但是,我希望保留这些行和颜色代码。输出低于 数据帧示例: 警告: 删除了包含缺失值的3行(几何点) 我试图用is.na(df$col3 | df$col4)创建另一个geom_点,但这不起作用 已尝试在中添加na.rm=FALSE
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))
请查看以下链接: 顺便说一句,你的解释很清楚你想要实现什么。我看到问题将与Col3和Col4中没有值时使用的形状和颜色有关。也许试着像这样解决它,比如 当NAN出现在Col3和Col4中时,颜色和形状就是Col1和Col2的相关性
另一个测试是使用geom_miss_point有几点需要注意-我想我已经理解OP在这里想要做什么了。在这种情况下,需要打印所有点。我将陈述我们希望情节看起来如何:
用于绘制x轴col1
用于绘制y轴col2
用于控制点的大小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\u shape\u manual()
和value
参数的命名向量来设置我们想要使用的实际形状
编辑
再想一想,NA出现在颜色和形状的图例中是没有意义的,所以让我们将其从颜色中删除。这是通过将col3
中包含NAs的数据集与不包含NAs的数据集完全分离来实现的:
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()
完成。添加的示例对于具有col1和col2值但不具有col3和col4值的点,您希望显示什么?是否仍希望这些内容显示在绘图上?如果是的话。。。他们会被贴上NA的标签,对吗?是的。我希望所有10个点都显示出来,但您希望在图例中如何标记它们?你想让它们出现在传说中吗?不想?任何类型的标签,只要未移除。可能变灰了?谢谢你的回复。我用输出和一个例子更新了问题。谢谢你的回答。为了适应更大的数据集,我尝试了一下。这很有效。不过,有两个问题需要澄清:谢谢你的回答。为了适应更大的数据集,我尝试了一下。这很有效。然而,有几个问题需要澄清:1)shape=“Not NA”和“NA”令人困惑。这是R中的正则表达式吗?我知道NA没有报价单。但“非NA”在我的数据中没有定义。2) “缩放形状”手册是否只是编辑图例的形状尺寸?3) 我在末尾添加了scale_size(range=c(0.25,4))以减小点的大小(因为我有10000行)。这是多余的功能吗?看起来不是这样。非常感谢。
shape=“Not NA”
不是作为逻辑表达式计算的。它只是为整个数据集提供一个名称。最好的考虑方法是:通常shape=col1
将引用数据中某列的名称,然后从该列数据中绘制标签作为因子(或连续)。当您将其更改为shape=“col1”
时,它不会引用列,而是。。。在您的数据集中,所有值都等于“col1”
,有点像“生成另一个”。如果是这种情况,并且您引用了这一列,那么您会将所有内容都标记为“col1”。有点像这样。scale\uuu
两个函数都指定了您希望ggplot
如何控制该比例。aes()
部分指定如何将其映射出来,如果不指定比例
,它将猜测最佳的区分方式。如果要更改默认形状、颜色等,则需要使用一些scale\函数指定
+-------------+-------------+-------------+----------+
| 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 |
+-------------+-------------+-------------+----------+
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()
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()