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

时间:2012-07-09 21:03:08

标签: r plot ggplot2 factors

我想做this question的反面,与this question相反,虽然那是关于传说,而不是情节本身。

其他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()

我明白了:

enter image description here

我只想在我的条形图中显示具有相应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()

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

2 个答案:

答案 0 :(得分:20)

一个简单的选项是在数据框na.omit()上使用df删除NA

的行
ggplot(na.omit(df), aes(x=name,y=var1)) + geom_bar()

鉴于您的更新,以下

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

工作正常,只考虑NA中的Var1。鉴于您只绘制nameVar,请将na.omit()应用于仅包含这些变量的数据框

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

答案 1 :(得分:5)

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

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