【问题标题】:ggplot2: control panel placement in facet_wrapggplot2:控制面板在 facet_wrap 中的位置
【发布时间】: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)

如果我通过manufacterermodel 使用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


【解决方案1】:

也许这足以让您走上正轨?关键贡献是来自ggpubr 包的ggarrange 方法。

library(dplyr)
library(ggplot2)
library(ggpubr)

mpgsub <- subset(mpg, manufacturer %in% c("audi", "dodge","jeep","subaru"))
mpgsub$model <- as.factor(mpgsub$model)

mpgsub1 = mpgsub %>%
  filter(manufacturer == "audi")

mpgsub2 = mpgsub %>%
  filter(manufacturer == "dodge")

plot1 = ggplot(mpgsub1, aes(cty, hwy)) + 
  geom_point() + 
  facet_grid(~model) +
  labs(title = "audi")

plot2 = ggplot(mpgsub2, aes(cty, hwy)) +
  geom_point() + 
  facet_grid(~model) +
  labs(title = "dodge")

plot3 = ggarrange(plot1,plot2, nrow = 2)

print(plot3)

【讨论】:

  • 你的情节在左边没有正确排列
猜你喜欢
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
  • 2016-06-14
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
相关资源
最近更新 更多