使用ggplot2在构面中删除未使用的级别


19

是否可以删除ggplot2s方面未使用的级别?这是我的代码:

tab = as.data.frame(cbind(groups = mtcars$cyl, names = row.names(mtcars), val = mtcars$mpg, N = mtcars$disp))
tab$N = as.numeric(tab$N)

ggplot(tab, aes(names,val)) + 
geom_point() + coord_flip() + 
theme_bw() + 
facet_grid(groups ~ ., drop=TRUE)#, scales="free", as.table=F, space="free")

我尝试了drop=T开关,但没有帮助。我究竟做错了什么?


对于像这样的纯编程(非统计)问题,请迁移到StackOverflow
smci 18'Sep

Answers:


27

您的示例数据只是没有任何未使用的级别要下降。检查此示例中的行为:

dat <- data.frame(x = runif(12),
                  y = runif(12),
                  grp1 = factor(rep(letters[1:4],times = 3)),
                  grp2 = factor(rep(LETTERS[1:2],times = 6)))

levels(dat$grp2) <- LETTERS[1:3]

ggplot(dat,aes(x = x,y = y)) + 
    facet_grid(grp1~grp2,drop = FALSE) + 
    geom_point()

ggplot(dat,aes(x = x,y = y)) + 
    facet_grid(grp1~grp2,drop = TRUE) + 
    geom_point()

可能是您要更改在每个构面的垂直轴上绘制的因子,在这种情况下,您需要设置scales参数并使用facet_wrap

ggplot(tab, aes(names,val)) + 
    geom_point() + coord_flip() + 
    theme_bw() + 
    facet_wrap(~groups,nrow = 3,scales = "free_x")

哦,我现在明白了。我的意图是仅绘制每个构面中实际上由构面分组的那些级别。例如,使用我的标签示例dotchart(as.numeric(tab$val), labels=tab$names, groups=tab$groups)。可能吗?
mrrrau 2012年

@mrrrau是的,请参阅我的编辑。
joran 2012年

21
对于将来的读者,drop删除该图的任何方面未使用的scales任何因子水平,同时删除该图的特定方面未使用的任何因子水平。这花了我一段时间才能从这篇文章中了解,所以我想在这里澄清一下,以免其他人遇到麻烦。
杰克·费舍尔

@JakeFisher感谢您指出这一点!很有帮助!
史蒂文”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.