同时使用facet_grid和facet_wrap

12

我正在尝试使用facet_wrap创建图表,其中每个包装的面板内部都有一个facet_grid,但我无法实现。有什么建议吗?

例如,如果我正在进行每月2种数量的同比平均值比较,我希望有:

  • 2个面板,分别用于每种数量,
  • 每个数量面板内部有12个面板,分别代表每个月份,
  • 每个月份面板内部有两个面板,分别代表每年。

我能够接近的最接近的结果是这个:

library(ggplot2)

# create dataset
df <- data.frame(
  Facet1 = rep(c(1,2,3),24),
  Facet2 = c(rep(1,24),rep(2,24)),
  Year = rep(c(rep(2012,12),rep(2013,12)),2),
  Month = rep(rep(1:12,2),2),
  ValueX = sample(0:5,144,replace = TRUE),
  ValueY = sample(0:5,144,replace = TRUE)
)

df <- df[!(df$Facet1 == 2 & df$Facet2 == 2),]

ggplot(df, aes(ValueX, ValueY)) + geom_point() +
    facet_grid(Facet2 + Year ~ Month)

输入图像描述

然而,我理想中希望的是类似于这样的东西(在我的想象中,类似于ggplot() ... + facet_grid(Year ~ Month) + facet_wrap(Facet2~.))-

输入图像描述

PS:我认为后者中的分面更易辨认和整洁。有评论吗?任何替代方案?


1
ggplot2 并不直接支持此功能,但拥有高级网格技能的人可以实现。您还可以导出图形并使用inkscape在<一分钟内完成相同的操作。 - Tyler Rinker
那么,facet_grid给了你想要的图表,但是你对各个分面之间的距离以及右侧的分面条不满意,希望对它们进行更改? - Roland
@Roland - 我想要实现的是 facet_grid(Year ~ Month) + facet_wrap(Facet2~.),这样就有两个 Facet2 的分面,然后每个分面再细分为 24 个 Year¬Month 的分面。目前使用的方法是 facet_grid(Facet2 + Year ~ Month),虽然最终得到了 48 个分面,但我认为第二张图片的分面更清晰,可读性更好。 - TheComeOnMan
1
我只能重申Tyler所说的话:ggplot2不支持此功能。您只能使用网格功能更改图形的距离和面板条。 - Roland
谢谢。你们认为这样更简洁吗?如果将其作为功能请求提交,对整个社区是否有用? - TheComeOnMan
4个回答

3
也许我没有理解你的意图,但是这个方法是否能实现你想要的结果?
ggplot(df, aes(ValueX, ValueY)) + geom_point() +
  facet_grid(Facet2 ~ Facet1)

如果您想更改面板标题以匹配您的示例,请查看facet_grid()labeller参数。


谢谢,但不是这样。我正在尝试实现多级分面,而不是编辑单个级别的分面本身。 - TheComeOnMan
如果这不能达到你想要的效果,你需要改进你的问题。这个代码可以完全按照你的模拟展示的效果来实现。 - Roland
非常感谢大家的建议,我已经编辑了问题并展示了一些我自己拼凑出来的东西,看起来很像我想要的结果。如果之前问题不够清晰,我很抱歉,希望现在更加明确了。 - TheComeOnMan

2
这可以很容易地使用cowplot完成:
最初的回答
plot1<-ggplot(df[df$Facet2==1,], aes(ValueX, ValueY)) + geom_point() +
  facet_grid(Year ~ Month)+
  theme_bw()

plot2<-ggplot(df[df$Facet2==2,], aes(ValueX, ValueY)) + geom_point() +
  facet_grid(Year ~ Month)+
  theme_bw()

plot_grid(plot1, plot2, labels = c("1", "2"), nrow = 2)

enter image description here


0

我不确定我理解你想做什么,但我认为使用lattice更容易得到你想要的结果:

library(latticeExtra)
xyplot(ValueY~ValueX|Facet1+Facet2,data=df, 
             between=list(x=2,y=0),
    par.settings = ggplot2like(),axis=axis.grid)

enter image description here


非常感谢您的输入@agstudy,我已经编辑了问题并展示了一些我拼凑起来的东西,看起来像是我想要得到的。我以前没有使用过lattice,所以无法对您的建议进行太多操作,但我尝试着玩了一下Facet1+Facet2部分,但没有什么效果。 - TheComeOnMan

0

如果你像Nakx为cowplot所做的那样,演示了ggpubr如何解决OP的问题,而不仅仅是链接到一个非常长的文档,那么这将是一个更好的答案。 - Gregor Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接