如何使用facet_wrap将行主序列更改为列主序列?

7
我想制作一个2x4的图表数组,显示随时间变化的分布情况。默认的ggplot排列方式是使用facet_wrap,顶部行显示系列1和2,第二行显示系列3和4等等。我想改变这种方式,使得第一列按顺序显示系列(1->2->3->4),然后第二列显示接下来的四个系列。这样你就可以垂直比较相邻的时间分布了(我认为它们应该是这样)。

更改包裹因子的级别..请参见此处 - agstudy
我意识到我可以做到这一点,但当级别仅是时间点时,这有些笨拙,你不觉得吗?级别将类似于(1,10,2,20,3,30,4,40,...)等等。 - Evan Zamir
2
我不明白你的意思,请提供一个可重现的例子。 - agstudy
其实并没有太多需要理解的。如果你使用facet_wrap(~time),默认情况下图形的顺序会先按行递增,然后再按列递增。我想要反过来。据我所知,唯一的方法似乎是将时间重新分级为无序因子。 - Evan Zamir
你可以创建一个虚拟变量,其因子顺序与时间变量相反,并在绘图中使用它... 当我输入这个时,我看到Dwin已经提供了这个答案。 - Brandon Bertelsen
1
可能是facet_wrap按列填充的重复问题。 - Eike P.
2个回答

11

使用 dir 参数来控制 facet_wrap() 的方向。默认为水平方向,可以切换为垂直方向:

# Horizontally
ggplot(mtcars, aes(x=hp, y=mpg)) + geom_point() + facet_wrap(~ cyl, ncol=2)

# Vertically
ggplot(mtcars, aes(x=hp, y=mpg)) + geom_point() + facet_wrap(~ cyl, ncol=2, dir="v")

这是答案。 - Unrelated

3
看起来在 facet_wrap 调用之前需要对排序因素进行处理:
 fac <- factor( fac, levels=as.character(c(1, 10, 2, 20, 3, 30, 4, 40) ) )

facet_wrap中,as/table的默认值为TRUE,这将把最低值(在此例中为“1”)放在左上角,最高值(在上面的示例中为“40”)放在右下角。因此:
 pl + facet_wrap(~fac, ncol=2, nrow=4)

从您的评论中可以看出,您正在使用数字类变量进行工作。(您的评论仍然没有提供一个可用的示例,而且似乎认为这是我们的责任而不是您自己的。何以得出这样的权利观念呢?)这应该创建一个可能是“列优先”排序的因子,其中包括数字或因子输入:

> ss <- 1:8; factor(ss, levels=ss[matrix(ss, ncol=2, byrow=TRUE)])
[1] 1 2 3 4 5 6 7 8
Levels: 1 3 5 7 2 4 6 8

另一方面,我可以想到一些情况下这可能是有效的方法:
> ss <- 1:8; factor(ss, levels=ss[matrix(ss, nrow=2, byrow=TRUE)])
[1] 1 2 3 4 5 6 7 8
Levels: 1 5 2 6 3 7 4 8

不幸的是,我认为这是唯一的方法。我只是不喜欢它,因为它不太优雅。哦,好吧。不能赢得所有人的支持。谢谢。 - Evan Zamir
2
你的情况可能不同,因为我提供的示例的默认排序与我创建的排序相同。最佳答案总是通过问题中包含的最多信息来实现的。 - IRTFM
我已经提供了所有所需的信息。facet_wrap(〜time)其中time = 1,2,3,4 ...这将默认先跨行绘制,然后再跨列绘制。您是在说您得到了与此不同的东西,它会先沿着列绘制,然后再沿着行绘制吗? - Evan Zamir
我在考虑展示 unique(fac) 也许会很有趣。有关于是否先显示前几个或后几个的选项,以及一旦我们知道特定水平的细节就会出现排序选项。 "魔鬼在于这些省略号实际上是什么细节。" - IRTFM
在这种情况下,我正在从数据集中选择行,例如ggplot(data[(data$days == 1 | data$days == 2 | data$days == 3),])。 - Evan Zamir
显示剩余3条评论

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