小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

ggplot2--facet各分面的坐標(biāo)軸自定義設(shè)置

 科白君 2022-02-19




 不求做的最好,但求做的更好。”   --科白君


"ggplot2繪圖"專題·第1篇
  編輯 | Dr.Cool

今日分享
ggplot2包是R語言一個(gè)強(qiáng)大的繪圖包,具有各種各樣的功能,能夠模仿甚至超越目前存在99%的繪圖軟件。它的底層邏輯類似ps的圖層邏輯,通過一層又一層的函數(shù),不斷地覆蓋并完善圖形,直至完成。而facet(分面)是ggplot2中常用的一個(gè)函數(shù),通常繪制的指標(biāo)過多時(shí),我們可以利用facet相關(guān)函數(shù)完成各子圖的繪圖,使得數(shù)據(jù)展示完整且美觀。由于不同指標(biāo)可能存在數(shù)據(jù)的數(shù)量級差異,因此今天主要與大家分享如何使用 geom_blank 函數(shù)在各個(gè)分面獲得更好的坐標(biāo)軸范圍。

01

ggplot2的分面類型


大家可能會(huì)好奇為什么進(jìn)行分面?分面有什么作用?

這里可以大聲告訴你,在做報(bào)告和發(fā)表專業(yè)期刊甚至是頂級期刊(Nnature、Science、Cell、PNAS)時(shí)的很多圖形中都用到了分面。它就好比九宮格甚至可以設(shè)置更多圖像,先將數(shù)據(jù)劃分成多個(gè)子集,并將每個(gè)子數(shù)據(jù)集填充繪制到頁面各小圖形中。通常我們繪圖時(shí)用到的分面有兩種類型:

1)facet_wrap -- 封裝類型

生成一個(gè) 1 維的多宮格,然后按行或按列順序添加子圖。具體如下圖:

2)facet_grid -- 網(wǎng)格類型

生成一個(gè) 2 維的多網(wǎng)格,通過行列對應(yīng)不同因子型的變量。具體如下圖:

特別提醒:兩者具體區(qū)別也可以看出,一個(gè)是生成1維的,另一個(gè)是生成2維的。也就是說,如果想要分別用兩個(gè)變量來表征多個(gè)子數(shù)據(jù)集時(shí)可以優(yōu)先考慮用facet_grid函數(shù)來繪圖。當(dāng)然,如果想用facet_wrap函數(shù)來繪制2維也可以,但是繪圖的效果可能不好。接下來,先與大家簡單分享下分面示例:

這里使用R語言自帶的數(shù)據(jù)集:"mpg"

1) 繪制單獨(dú)的面板 -- facet_null ()

# 加載R包
library(ggplot2)

# 繪制散點(diǎn)圖
ggplot(mpg, aes(cty, hwy)) +
  geom_point() +
  facet_null() # 繪制單一面板

2) facet_wrap 單一變量:var ~ .

ggplot(mpg, aes(cty, hwy)) + 
  geom_point() +
  facet_wrap(cyl ~ .)

3) facet_wrap 多變量:var(var1 , var2) 或者 var1~var2

ggplot(mpg, aes(cty, hwy)) + 
  geom_point() +
  #facet_wrap( cyl ~ drv)
  facet_wrap(vars(cyl, drv))

4) facet_grid 一行多列或者是多行一列:. ~ var 或 var ~ .

ggplot(mpg, aes(cty, hwy)) + 
  geom_point() +
  # facet_grid( . ~ cyl)
  facet_grid(cyl ~ .)

5) facet_grid 多行多列:. ~ var 或 var ~ .

ggplot(mpg, aes(cty, hwy)) + 
  geom_point() +
  facet_grid(drv ~ cyl)

02

facet分面設(shè)定更好的坐標(biāo)軸范圍


關(guān)于facet分面其他的一些細(xì)節(jié),在這里我們不贅述了,網(wǎng)上也有很多相關(guān)介紹。今天主要想和大家分享一下有關(guān)facet分面中如何設(shè)定更好的坐標(biāo)軸范圍。該函數(shù)有一個(gè)參數(shù)--scales,它主要作用是可以根據(jù)不同子圖(各分面的數(shù)據(jù)集范圍)對x和y軸進(jìn)行自動(dòng)生成(但是自動(dòng)生成的范圍不一定是我們想要的,如導(dǎo)致圖的比例不美觀等等)。而平時(shí)我們使用的scale_y_continuous都是對一個(gè)圖形背景所有的范圍進(jìn)行設(shè)置,不能很好的解決這個(gè)問題。這里,我們推薦使用geom_blank函數(shù)來完成該功能。

1) 我們先構(gòu)建一個(gè)數(shù)據(jù)集:由于是隨機(jī)構(gòu)建的,可以設(shè)置種子保證每次結(jié)果復(fù)現(xiàn)一致

set.seed(20220219)
create_df <- rbind(data.frame(group="a", x = runif(100), y = rnorm(100, mean = 5)),
                  data.frame(group="b", x = runif(100), y = rnorm(100, mean = 5, sd = 3)+20),
                  data.frame(group="c", x = runif(100), y = rnorm(100, mean = 5, sd = 5)+30))
str(create_df)

2) 緊接著把構(gòu)建的數(shù)據(jù)繪制成圖

ggplot() + 
  geom_point(data = create_df, aes(x = x, y = y, colour = group), size = 3) +
  facet_wrap( ~ group, scales = "free_y") + # 使用scale ="free_y"允許y軸在保持x軸不變的情況下變化(意思可以更改y軸范圍)
  theme_bw()

這里可以利用?facet_wrap查看相關(guān)函數(shù)的介紹 , scales = "free" 對應(yīng)的介紹也非常詳細(xì)~可以看出來由于圖形比例不當(dāng),導(dǎo)致的圖結(jié)果并不美觀。

3) 調(diào)整圖形坐標(biāo)軸的比例,如果使用單一面板或所有相同比例的數(shù)據(jù)時(shí),通常使用 coord_cartesian 函數(shù)。但是當(dāng)具有不同比例的面板時(shí),這個(gè)效果并不好,它強(qiáng)制所有內(nèi)容都處于相同的比例。結(jié)果如下:

ggplot() + 
  geom_point(data = create_df, aes(x = x, y = y, colour = group), size = 3) +
  facet_wrap( ~ group, scales = "free_y") +
  coord_cartesian(ylim = c(0, 75)) +
  theme_bw()

從圖來看,點(diǎn)確實(shí)是聚集起來了,但是各分面都有多余的空間。使得圖看起來不協(xié)調(diào)。

另一種我們還可以選擇使用 expand_limits() 強(qiáng)制各分面從原點(diǎn)開始。使用 scale_y_continuous(expand=c(0,0)) 刪除 y 軸限制的緩沖區(qū)。其中expand 的兩個(gè)值是 c(乘數(shù)緩沖區(qū),加法緩沖區(qū))。通過包含 c(0,0),我們不包含軸刻度上的任何緩沖區(qū)。結(jié)果如下:

ggplot() + 
  geom_point(data = create_df, aes(x = x, y = y, colour = group), size = 3) +
  facet_wrap( ~ group, scales = "free_y") +
  expand_limits(y = 0) +
  scale_y_continuous(expand = c(0, 0)) +
  theme_bw()

從圖來看還是不能很好的解決不同比例的y軸范圍。為了解決這些問題,可以使用 geom_blank,它能夠完美的解決各分面的坐標(biāo)軸范圍問題。首先創(chuàng)建一個(gè)數(shù)據(jù)集,其中包含我們數(shù)據(jù)集中每個(gè)組級別的 y 軸的最小值和最大值。然后使用 geom_blank 將其傳遞給 ggplot 就可以完美解決了。

blank_data <- data.frame(group = c("a", "a", "b", "b", "c", "c"), 
                         x = 0, y = c(2, 8, 10, 40, 20, 50))

ggplot() +
  geom_point(data = create_df, aes(x = x, y = y, colour = group), size = 3) +
  geom_blank(data = blank_data, aes(x = x, y = y)) +
  facet_wrap( ~ group, scales = "free_y") +
  scale_y_continuous(expand = c(0, 0)) +
  theme_bw()

關(guān)于數(shù)據(jù)集的設(shè)定我們需要考慮幾點(diǎn)

1)group分組的名稱要一一對應(yīng)

2)對應(yīng)y軸的值要有兩個(gè)點(diǎn)(最小值和最大值)

3)要考慮清楚各分面哪個(gè)范圍的圖看起來更加美觀,比例更加協(xié)調(diào)

感興趣的同學(xué)可以通過以下方式與我們溝通、交流和學(xué)習(xí):

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多