ggplot2系列教程 第4節(jié)——分面

本期內(nèi)容:

  1. facet_wrap(一維面板)
  2. facet_grid(二維面板)

如何將一個(gè)數(shù)據(jù)的多個(gè)子數(shù)據(jù)集同時(shí)展示在一個(gè)頁(yè)面瓢棒?本期我們來學(xué)習(xí)ggplot2中的分面功能坞淮。老規(guī)矩伴挚,依然依然依然還是iris這個(gè)數(shù)據(jù),此次在此數(shù)據(jù)基礎(chǔ)上隨機(jī)生成兩個(gè)新變量ClassGroup邀层,如下异赫,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幫助文檔)

  1. label_value

  2. label_context

  3. label_parsed

  4. 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>

  1. B ?? A

  2. 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)行贅述麻裁。

最后

  1. 感謝支持箍镜,希望對(duì)您有幫助!
  2. 有不足的地方歡迎指正煎源!
  3. 關(guān)注我們色迂,及時(shí)獲取更多干貨!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末手销,一起剝皮案震驚了整個(gè)濱河市歇僧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖诈悍,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祸轮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡侥钳,警方通過查閱死者的電腦和手機(jī)适袜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舷夺,“玉大人苦酱,你說我怎么就攤上這事「” “怎么了疫萤?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)敢伸。 經(jīng)常有香客問我扯饶,道長(zhǎng),這世上最難降的妖魔是什么池颈? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任帝际,我火速辦了婚禮,結(jié)果婚禮上饶辙,老公的妹妹穿的比我還像新娘。我一直安慰自己斑粱,他們只是感情好弃揽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著则北,像睡著了一般矿微。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尚揣,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天涌矢,我揣著相機(jī)與錄音,去河邊找鬼快骗。 笑死娜庇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的方篮。 我是一名探鬼主播名秀,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼是鬼!你這毒婦竟也來了饺蔑?” 一聲冷哼從身側(cè)響起沽损,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤袖外,失蹤者是張志新(化名)和其女友劉穎汁掠,沒想到半個(gè)月后略吨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡考阱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年翠忠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羔砾。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡负间,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姜凄,到底是詐尸還是另有隱情政溃,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布态秧,位于F島的核電站董虱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏申鱼。R本人自食惡果不足惜愤诱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捐友。 院中可真熱鬧淫半,春花似錦、人聲如沸匣砖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)猴鲫。三九已至对人,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拂共,已是汗流浹背牺弄。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宜狐,地道東北人势告。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像肌厨,于是被迫代替她去往敵國(guó)和親培慌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • ggplot2語(yǔ)法 入門級(jí)繪圖模版屬性設(shè)置分面幾何對(duì)象統(tǒng)計(jì)變換位置調(diào)整坐標(biāo)系 以上是各種參數(shù)柑爸,需要的時(shí)候用一下就可...
    Ashu閱讀 2,566評(píng)論 0 8
  • 前言 分面的作用是在一個(gè)頁(yè)面上自動(dòng)放置多幅圖像吵护,它先將數(shù)據(jù)劃分為多個(gè)不同的子集,然后分別將每個(gè)子數(shù)據(jù)集繪制到頁(yè)面的...
    名本無名閱讀 20,882評(píng)論 3 9
  • 4.2 dplyr包簡(jiǎn)介 dplyr包提供了一組函數(shù)祥诽,用于有效地操作R中的數(shù)據(jù)集。dplyr包是下一代“plyr”...
    ZMQ要加油呀閱讀 1,296評(píng)論 0 0
  • ggplot2 是一個(gè) R 語(yǔ)言的繪圖工具包瓮恭,它使用基于圖層的構(gòu)建方式使得代碼更加可讀雄坪、靈活。下面是 ggplot...
    willow_d1f2閱讀 434評(píng)論 0 1
  • A ggplot2 Tutorial for Beautiful Plotting in R 原文見https:/...
    iColors閱讀 2,682評(píng)論 0 15