假设我有一个缺少值的数据框:
df <- data.frame(
group = rep(c("A", "B", "C"), each = 3),
x = runif(9),
y = c(runif(6), NA, NA, NA)
)
我想用审美映射和/或方面来绘制它:
ggplot(df, aes(x, y)) +
geom_point(aes(color = group)) +
facet_grid(.~group, drop = T) +
theme_bw()
其中会产生以下警告信息和图表:
Warning message:
Removed 3 rows containing missing values (geom_point).
如您所见,C组中没有y的观察值,这意味着无法绘制该组的数据。但是,ggplot仍然会创建一个空C面和一个C图例条目。有没有办法让ggplot意识到它正在从C组中删除所有数据,并删除相应的facet和图例条目?
显然,一个解决方案是从基础数据中删除这些行。但是,我的非简化数据帧可以用作组或轴变量的数十列,其中NA值块分散在各处。这意味着我需要为我想要创建的每个图形以不同的方式对数据进行子集化。我希望有一个更简单的解决方案。
我已经看到了与unused factors in single facets和subsets of data相关的相关问题,但由于NA值的原因,那里提供的解决方案似乎无法处理丢失的数据。
编辑以澄清其他复杂性:顶部的数据已经过简化,并提出了一个简单的解决方案,例如na.omit()
。但是,我的真实数据看起来更像是这样(显然仍然简化):
df <- data.frame(
group = rep(c("A", "B", "C"), each = 3),
v = c(runif(3), rep(NA, 6)),
w = c(NA, NA, NA, runif(6)),
x = runif(9),
y = c(runif(6), NA, NA, NA),
z = runif(9)
)
我想创建许多不同的图形,显示不同变量之间的关系。所以,如果我想绘制x与z的关系图,我会显示所有三个方面和图例条目,而如果我绘制w与y的关系,我只显示B.在此数据帧上运行na.omit()
将删除每一行。
显然,我可以将数据框子化为仅用于绘图的列,而不是删除NA行。但是,这需要我为每个图形创建一个新的数据框,这看起来既乏味又不优雅。出于这个原因,我希望有一个更具体的基于ggplot的解决方案。 (当然我会接受一个答案,例如&#34;没有ggplot解决方案,你必须为每个图形创建一个新的数据帧&#34;如果确实如此)。
答案 0 :(得分:2)
使用更新的示例,您可以使用Return
或na.omit
来获得所需的结果。用:
complete.cases
或:
ggplot(df[complete.cases(df[,c('w','y')]),], aes(w, y)) +
geom_point(aes(color = group)) +
facet_grid(.~group, drop = TRUE) +
theme_bw()
你得到:
旧回答:在ggplot(na.omit(df[,c('group','w','y')]), aes(w, y)) +
geom_point(aes(color = group)) +
facet_grid(.~group, drop = TRUE) +
theme_bw()
电话中使用na.omit(df)
代替df
:
ggplot
会给你想要的结果: