【发布时间】:2018-04-17 17:03:21
【问题描述】:
我有一个包含嵌套因子的数据集,类似于 model 嵌套在 manufacturer 中的 mpg 数据集:
mpgsub <- subset(mpg, manufacturer %in% c("audi", "dodge","jeep","subaru"))
mpgsub$model <- as.factor(mpgsub$model)
table(mpgsub$manufacturer, mpgsub$model)
如果我通过manufacterer 和model 使用facet_grid,我会得到空面板:
ggplot(mpgsub, aes(cty, hwy)) + geom_point() + facet_grid(manufacturer~model)
我想制作一个按模型分面的 ggplot,但按制造商将面板排列成行。
我用facet_wrap 尝试过这个。我意识到如果我更改model 因子的级别顺序,我可以控制面板排序,但它仍然只是包装而不考虑manufacturer。
#order models by manufacturer
levels(mpgsub$model)
mpgsub$model <- factor(mpgsub$model, levels=c(
"a4", "a4 quattro","a6 quattro" , #Audi
"caravan 2wd", "dakota pickup 4wd",
"durango 4wd", "ram 1500 pickup 4wd", #Dodge
"grand cherokee 4wd", #Jeep
"forester awd","impreza awd" )) #Subaru
ggplot(mpgsub, aes(cty, hwy)) + geom_point()+ facet_wrap(~model, nrow=4, ncol=4)
理想情况下,我会按制造商将面板排列成行,即使这意味着不同的行长,因为在我的子集中,每个制造商都有不同数量的模型。我在一个图形软件中安排了下面的图片-有什么方法可以让 ggplot2 做到这一点?
我知道我可以使用scales=FREE 参数来控制类似的事情,正如在# Free scales ---- here 下讨论的那样,但它似乎只适用于 x 或 y 轴,我想保留 y 轴对于不同的变量。
【问题讨论】:
-
根据我的经验,这不是刻面可以轻松做到的。我建议按制造商拆分数据,然后分别绘制每一行。您可能必须手动对齐绘图并为所有面板设置相同的轴限制。
-
我有点搞砸了,但我认为你最好的选择可能是按制造商拆分数据框,列出
ggplot对象,然后用 @ 绘制你想要的方式987654344@。如果您认为它适合您的情况,我可以尝试将答案放在一起。cowplot的优点是它可以对齐轴,类似于 facet 的作用。 -
我经常不得不求助于库
gridExtra来处理这种事情。在此处查看 baptiste 的帮助页面:cran.r-project.org/web/packages/gridExtra/vignettes/…
标签: r ggplot2 facet-wrap facet-grid