我一直在阅读ggplot2
的文档,关注两个函数的区别以及每个函数适合使用的情况(facet_wrap()
和facet_grid()
)。
library(ggplot2)
p <- qplot(displ, hwy, data = mpg)
p + facet_wrap(~ cyl)
p + facet_grid(~ cyl)
我提供这个小例子作为起点。差异似乎在于wrap使图表更加自主,而grid使一个图表结合在一起。
我一直在阅读ggplot2
的文档,关注两个函数的区别以及每个函数适合使用的情况(facet_wrap()
和facet_grid()
)。
library(ggplot2)
p <- qplot(displ, hwy, data = mpg)
p + facet_wrap(~ cyl)
p + facet_grid(~ cyl)
我提供这个小例子作为起点。差异似乎在于wrap使图表更加自主,而grid使一个图表结合在一起。
下面的回答是针对在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 的每一种组合。
facet_wrap(...)
函数可以根据一个变量把不同的ggplots
组合在一起形成多个子图(facets)。而facet_grid(...)
函数则可以接受两个变量:
p + facet_grid(cyl~class)
您还可以使用第三个变量将每个面板中的数据进行分组:
qplot(displ, hwy, data=mpg,color=factor(year)) + facet_grid(cyl~class)
显示了按汽缸数和级别分类的公路里程与排量改善(或缺乏改善)情况。
主要引用自《ggplot2 book》第148页及之后的在线版本:https://ggplot2-book.org/facet.html
有三种分面类型:
facet_null()
:单个图表,为默认设置。facet_wrap()
:将一维面板条“包裹”成二维。facet_grid()
:生成由变量定义的二维面板网格,这些变量形成行和列。分面包裹
facet_wrap()
将一个长的面板条(由任意数量的变量生成)“包裹”成二维。如果您有一个带有许多水平的单个变量,并且想以更加节省空间的方式排列图表,则此功能很有用。
您可以使用ncol
、nrow
、as.table
和dir
控制如何将该面板条包裹成网格。 ncol
和nrow
控制列和行的数量(只需要设置一个)。 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))
( 简化版 ) 示例来自?facet_grid
对于单变量图,您可以使用 facet_grid()
或 facet_wrap()
。
facet_wrap(~variable)
将返回一个关于 variable
水平对称的矩阵图。
facet_grid(.~variable)
将返回根据 variable
等级水平分布的小图。
facet_grid(variable~.)
将返回根据 variable
等级垂直分布的小图。
facet_wrap(~variable)
而不是 facet_wrap(variable~)
吗? - amsquareb
facet_wrap
函数也可以使用两个变量。 - marbel