ggplot2中的facet_wrap()和facet_grid()有什么区别?

91

我一直在阅读ggplot2的文档,关注两个函数的区别以及每个函数适合使用的情况(facet_wrap()facet_grid())。

library(ggplot2)

p <- qplot(displ, hwy, data = mpg)
p + facet_wrap(~ cyl)

p + facet_grid(~ cyl)

我提供这个小例子作为起点。差异似乎在于wrap使图表更加自主,而grid使一个图表结合在一起。

4个回答

71

下面的回答是针对在facet_grid()facet_wrap()中有2个参数的情况。

facet_grid(x ~ y)将显示x*y个图,即使有些图是空的。例如:

library(ggplot2)
g <- ggplot(mpg, aes(displ, hwy))

有4个不同的圆柱和7个不同的类别值。

g + geom_point(alpha=1/3) + facet_grid(cyl~class)

以上显示了4 * 7 = 28个图表,即使有些是空的(因为某些类别没有相应的汽缸值,比如class="midsize"的行没有任何对应的cyl="5"的值)facet_wrap(x ~ y)则只显示具有实际值的图表。

g + geom_point(alpha=1/3) + facet_wrap(cyl~class)

现在展示了19个图,每个图都代表 cyl 和 class 的每一种组合。


24

facet_wrap(...)函数可以根据一个变量把不同的ggplots组合在一起形成多个子图(facets)。而facet_grid(...)函数则可以接受两个变量:

p + facet_grid(cyl~class)

您还可以使用第三个变量将每个面板中的数据进行分组:

qplot(displ, hwy, data=mpg,color=factor(year)) + facet_grid(cyl~class)

显示了按汽缸数和级别分类的公路里程与排量改善(或缺乏改善)情况。


14
facet_wrap函数也可以使用两个变量。 - marbel

22

主要引用自《ggplot2 book》第148页及之后的在线版本:https://ggplot2-book.org/facet.html

有三种分面类型:

  • facet_null():单个图表,为默认设置。
  • facet_wrap():将一维面板条“包裹”成二维。
  • facet_grid():生成由变量定义的二维面板网格,这些变量形成行和列。

enter image description here

分面包裹

facet_wrap()将一个长的面板条(由任意数量的变量生成)“包裹”成二维。如果您有一个带有许多水平的单个变量,并且想以更加节省空间的方式排列图表,则此功能很有用。

您可以使用ncolnrowas.tabledir控制如何将该面板条包裹成网格。 ncolnrow控制列和行的数量(只需要设置一个)。 as.table控制是否将面板布局类似于表格(TRUE),最大值在右下方,还是绘图(FALSE),最大值在右上方。 dir控制包裹的方向:水平或垂直。

分面网格

?facet_grid中可知:facet_grid()可以根据行和列分面变量形成面板矩阵。当您有两个离散变量且数据中存在所有变量组合时,此功能最有用。

您可以通过将它们“添加”到一起来在行或列中使用多个变量,例如:a + b ~ c + d

facet_grid()还有一个名为space的额外参数,它采用与scales相同的值。

# If scales and space are free, then the mapping between position
# and values in the data will be the same across all panels. This
# is particularly useful for categorical axes
ggplot(subset(mpg, manufacturer %in% c("audi", "honda", "toyota")) , aes(drv, model)) +
    geom_point() +
    facet_grid(manufacturer ~ ., scales = "free", space = "free") +
    theme(strip.text.y = element_text(angle = 0))

enter image description here

( 简化版 ) 示例来自?facet_grid


11

对于单变量图,您可以使用 facet_grid()facet_wrap()

facet_wrap(~variable) 将返回一个关于 variable 水平对称的矩阵图。

facet_grid(.~variable) 将返回根据 variable 等级水平分布的小图。

facet_grid(variable~.) 将返回根据 variable 等级垂直分布的小图。


1
你知道为什么是 facet_wrap(~variable) 而不是 facet_wrap(variable~) 吗? - amsquareb

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