从ggplot条形图中删除未使用的因子水平

Hen*_*ndy 19 plot r factors ggplot2

我想做这个问题的反面,并且与这个问题相反,尽管这是关于传说,而不是情节本身.

其他SO问题似乎在询问如何保持未使用的因子水平.我实际上喜欢我的删除.我有几个名称变量和几个列(宽格式)的变量属性,我用它来创建多个条形图.这是一个可重复的例子:

library(ggplot2)
df <- data.frame(name=c("A","B","C"), var1=c(1,NA,2),var2=c(3,4,5))
ggplot(df, aes(x=name,y=var1)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)

我明白了:

在此输入图像描述

我只想在我的条形图中显示具有相应var n的名称(因为,B中没有空白空间).

如果我可以简单地更改输出文件名和y=var位,则重用基本绘图代码将非常容易.我希望不必对我的数据框进行子集,只是为了尽可能在每个绘图的结果上使用droplevels!


根据na.omit()建议更新

考虑修订的数据集:

library(ggplot2)
df <- data.frame(name=c("A","B","C"), var1=c(1,NA,2),var2=c(3,4,5), var3=c(NA,6,7))
ggplot(df, aes(x=name,y=var1)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)

我需要na.omit()用于绘图,var1因为存在NA.但是由于na.omit确保所有列都存在值,因此该图A也会删除,因为它具有NA var3.这更类似于我的数据.我总共响应了15个NAs.我只想删除没有当前绘制的y向量值的因子级别,而不是在整个数据帧中的任何向量中都有NA .

Rei*_*son 20

一个简单的选择是na.omit()在数据框上使用df以删除这些行NA

ggplot(na.omit(df), aes(x=name,y=var1)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)

鉴于您的更新,以下内容

ggplot(df[!is.na(df$var1), ], aes(x=name,y=var1)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)

工作正常,只考虑NAVar1.鉴于您只是绘图,nameVar应用于na.omit()仅包含这些变量的数据框

ggplot(na.omit(df[, c("name", "var1")]), aes(x=name,y=var1)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)


Til*_*und 5

请注意,在绘图时,您只使用数据框的两列,这意味着,您可以采用相关列来x[,c("name", "var1")]应用na.omit来删除不需要的行,而不是传递整个data.frame (正如Gavin Simpson建议的那样)na.omit(x[,c("name", "var1")])然后绘制这些数据.

我的R/ggplot非常生疏,我意识到可能有更简洁的方法来实现这一目标.