本期內(nèi)容:
- facet_wrap(一維面板)
- facet_grid(二維面板)
如何將一個(gè)數(shù)據(jù)的多個(gè)子數(shù)據(jù)集同時(shí)展示在一個(gè)頁(yè)面瓢棒?本期我們來學(xué)習(xí)ggplot2中的分面功能坞淮。老規(guī)矩伴挚,依然依然依然還是iris這個(gè)數(shù)據(jù),此次在此數(shù)據(jù)基礎(chǔ)上隨機(jī)生成兩個(gè)新變量Class和Group邀层,如下异赫,Class列包含1-3三種類型椅挣,Group列包含A和B兩種類型(將Group設(shè)置為因子型,注意這里我們將levels設(shè)置為了先B再到A):
DT <- iris
set.seed(8)
DT$Class <- sample(1:3, nrow(iris), replace = T)
set.seed(88)
DT$Group <- sample(LETTERS[1:2], nrow(iris), replace = T)
DT$Group <- factor(DT$Group, levels = c("B", "A")) # 轉(zhuǎn)為因子型
head(DT, 20)
請(qǐng)出這個(gè)老演員祝辣,依然以它為初始圖:
library(ggplot2)
p <- ggplot(data = DT, aes(x = Sepal.Length, y = Sepal.Width)) +
geom_point(aes(color = Petal.Length, size = Petal.Width, shape = Species)) +
scale_color_gradient(low = "#f0cf61", high = "#371722") +
scale_size_continuous(range = c(1, 4)) +
theme_classic() +
labs(x = "Sepal Length", y = "Sepal Width", title = "Iris Sepal") +
theme(plot.title = element_text(size = 15, face = "bold", hjust = 0.5),
axis.title = element_text(face = "bold"),
legend.title = element_text(face = "bold"),
axis.text = element_text(size = 13),
legend.text = element_text(size = 12))
p
facet_wrap(一維面板)
首先我們按照Species的分類來生成一幅分面圖:
p + facet_wrap(facets = vars(Species))
可以看到初始圖中的點(diǎn)按照Species拆分為了三個(gè)子圖贴妻,以上每個(gè)子圖對(duì)應(yīng)頂部標(biāo)簽所示分組。如果想再疊加一層其他變量蝙斜,比如Group可以如下:
p + facet_wrap(facets = vars(Species, Group))
它還有另外兩種寫法:
p + facet_wrap(facets = c("Species", "Group"))
p + facet_wrap(facets = ~ Species + Group)
上圖中,比如第一個(gè)子圖中的每個(gè)點(diǎn)就代表Species為setosa同時(shí)Group為B的鳶尾花萼片的長(zhǎng)和寬澎胡。
分面標(biāo)簽調(diào)整
調(diào)整輸入列名的順序即可修改分面標(biāo)簽的順序(另兩種寫法同理):
p + facet_wrap(facets = ~ Group + Species)
分面標(biāo)簽?zāi)J(rèn)直接顯示分面變量的值孕荠,也可以簡(jiǎn)單加上變量的名稱,如:
p + facet_wrap(facets = ~ Group + Species, labeller = "label_both")
# 或
p + facet_wrap(facets = \~ Group + Species, labeller = label_both)
此處label_both為預(yù)先定義好的函數(shù)攻谁,另外的函數(shù)還有:(具體詳見labellers幫助文檔)
label_value
label_context
label_parsed
label_wrap_gen
我們還可以自定義函數(shù)稚伍,比如我們定義一個(gè)對(duì)輸入值截取前兩個(gè)字母的函數(shù),然后使用labeller函數(shù)轉(zhuǎn)換為參數(shù)傳遞給labeller選項(xiàng):
SUB <- function(x) {
substr(x, 1, 2)
}
p + facet_wrap(facets = ~ Group + Species,
labeller = labeller(Species = SUB))
或者直接指定替換內(nèi)容:
Group2 <- c(B = "Group: B", A = "Group: A")
Species2 <- c(setosa = "SE", versicolor = "VE", virginica = "VI")
print(Group2)
print(Species2)
p + facet_wrap(facets = ~ Group + Species,
labeller = labeller(Group = Group2,
Species = Species2))
用strip.position函數(shù)可以調(diào)整分面標(biāo)簽的位置戚宦,如下調(diào)至右方:
p + facet_wrap(facets = ~ Group + Species, strip.position = "right")
固定行/列數(shù)
此外我們還可以固定分面展示的行數(shù)个曙,如下,讓它排成一行:
p + facet_wrap(facets = ~ Group + Species, nrow = 1)
或者列數(shù)受楼,如下排成兩列:
p + facet_wrap(facets = ~ Group + Species, ncol = 2)
分面展示順序
在以上的圖片中垦搬,沿水平方向(從左往右),從上往下艳汽,我們可以看到子圖展示的順序?yàn)椋?/p>
B ?? A
setosa ?? versicolor ?? virginica
這是因?yàn)槲覀冊(cè)谠O(shè)置facets時(shí)猴贰,設(shè)置了先Group后Species,因此會(huì)先按Group再按Species來排序河狐。另外米绕,在ggplot2繪圖中對(duì)于因子變量的繪圖,順序會(huì)默認(rèn)按照其levels設(shè)置的順序馋艺。這兩個(gè)變量的levels順序分別為以上順序:
levels(DT$Species)
levels(DT$Group)
在facet_wrap中的dir參數(shù)默認(rèn)值為h (水平方向)栅干,
as.table參數(shù)默認(rèn)值為TRUE,因此它會(huì)按照我們?nèi)粘捐祠?幢砀竦牧?xí)慣來從上至下碱鳞,從左至右排布:
所以要想按照垂直方向擺放圖片,只需:
p + facet_wrap(facets = ~ Group + Species, ncol = 2, dir = "v")
而當(dāng)as.table參數(shù)默認(rèn)值為FALSE時(shí)雏赦,則是按照繪圖的邏輯劫笙,從下到上擺放:
p + facet_wrap(facets = ~ Group + Species, ncol = 2, as.table = F)
調(diào)整坐標(biāo)軸顯示范圍
以上我們可以看到所有子圖的坐標(biāo)軸是固定的芙扎,如果想要坐標(biāo)軸根據(jù)每個(gè)子圖中的實(shí)際數(shù)值范圍來決定,我們可以用scales選項(xiàng)設(shè)置:fixed(默認(rèn)填大,X和Y軸都固定)戒洼;free_x(X軸自由,固定Y軸)允华;free_y(Y軸自由圈浇,固定X軸);free(X和Y軸都自由)靴寂。如:
p + facet_wrap(facets = ~ Group + Species, ncol = 2, scales = "free_x")
p + facet_wrap(facets = ~ Group + Species, ncol = 2, scales = "free_y")
p + facet_wrap(facets = ~ Group + Species, ncol = 2, scales = "free")
facet_grid(二維面板)
通過以上內(nèi)容我們可以發(fā)現(xiàn)facet_wrap只有一個(gè)維度磷蜀,它的排布沒有行列的概念,只是根據(jù)子集作圖然后按順序排布百炬。接下來我們了解一下二維排布的面板褐隆,如下我們?cè)O(shè)置以Species來按行分面:
p + facet_grid(rows = vars(Species))
# 或其它兩種寫法(同facet_wrap)
p + facet_grid(rows = "Species")
p + facet_grid(Species ~ .)
或者按列分面:
p + facet_grid(. ~ Species)
或者以Group按行,Species按列分面:
p + facet_grid(Group ~ Species)
以上每個(gè)子圖剖踊,比如左上第一個(gè)庶弃,即對(duì)應(yīng)Species為setosa且Group為B的數(shù)據(jù)作的圖,把Class變量也加進(jìn)來:
p + facet_grid(Group + Class ~ Species)
調(diào)整坐標(biāo)軸的顯示范圍的方式和facet_warp一致:
p + facet_grid(Group + Class ~ Species, scales = "free")
此外facet_grid還提供space選項(xiàng)德澈,來根據(jù)坐標(biāo)軸范圍自由調(diào)整各個(gè)子圖大小歇攻,同樣也是:fixed(默認(rèn),X和Y軸都固定)梆造;free_x(X軸自由缴守,固定Y軸);free_y(Y軸自由镇辉,固定X軸)屡穗;free(X和Y軸都自由)。如下XY軸都自由調(diào)整:
p + facet_grid(Group + Class ~ Species, scales = "free", space = "free")
最后摊聋,還可以使用margin選項(xiàng)添加一個(gè)額外的分面來顯示當(dāng)前分面行或列的所有數(shù)據(jù):
p + facet_grid(Group ~ Species, scales = "free", space = "free",
margins = T)
如果只想顯示其中一個(gè)分面的所有數(shù)據(jù)鸡捐,可以直接指定分面的變量名:
p + facet_grid(Group ~ Species, scales = "free", space = "free",
margins = "Species")
labeller選項(xiàng)設(shè)置分面標(biāo)簽和as.table設(shè)置擺放順序的方法和facet_wrap中的一致,在此不再進(jìn)行贅述麻裁。
最后
- 感謝支持箍镜,希望對(duì)您有幫助!
- 有不足的地方歡迎指正煎源!
- 關(guān)注我們色迂,及時(shí)獲取更多干貨!