數(shù)據(jù)準備
本示例數(shù)據(jù)是自編數(shù)據(jù),僅為練習所用蚌成,數(shù)據(jù)結(jié)構假設為前痘,兩個年份year(2020,2021)担忧,兩個氮水平nitrogen(N1芹缔,N2),兩個玉米品種variety(a瓶盛,b)測定了5個試驗指標(變量v1最欠,v2,v3惩猫,v4芝硬,v5),每個處理3次重復block(1轧房,2拌阴,3)。
library(tidyverse) # 調(diào)用tidyverse奶镶。
df <- read_csv(file = "df.csv") # 導入數(shù)據(jù)迟赃。文檔在工作目錄下,所以直接給文件名導入实辑。
df # 查看數(shù)據(jù)捺氢。
## # A tibble: 24 × 9
## year nitrogen variety block v1 v2 v3 v4 v5
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2020 N1 a 1 1.26 2.14 0.4 5 3.25
## 2 2020 N1 a 2 1.2 2.9 0.1 5.3 1.27
## 3 2020 N1 a 3 1.3 3 0.3 5.6 2.24
## 4 2020 N1 b 1 1.08 1.72 1.8 2.8 1
## 5 2020 N1 b 2 1.05 1.65 1.7 2.5 3.12
## 6 2020 N1 b 3 1.15 1.35 1.5 3.1 4.57
## 7 2020 N2 a 1 1.32 3.78 1.6 6 5.85
## 8 2020 N2 a 2 1.28 4.32 1.4 6.1 6.48
## 9 2020 N2 a 3 1.35 3.95 1.3 6.2 7.21
## 10 2020 N2 b 1 1.33 3.47 2.8 4.1 6.56
## # … with 14 more rows
7.2 標度(scale)
標度(scale)
標度是將數(shù)據(jù)空間(標度的定義域)映射到圖形屬性空間(標度的值域)的一個函數(shù)藻丢。
標度的作用是調(diào)整數(shù)據(jù)映射的圖形屬性。這些屬性包括顏色,位置枷餐,形狀注盈,大小,線條類型等斋否。
ggplot2為每一種圖形屬性提供了一個默認的標度梨水,當默認標度不滿足我們的作圖需求時,我們需要對默認標度進行修改茵臭。
標度變換
要想將圖形屬性映射為變量疫诽,需要在函數(shù)aes()中將圖形屬性名稱和變量名稱關聯(lián)起來。ggplot2會自動為每個變量值分配唯一的圖形屬性水平,這個過程即為標度變換奇徒。
通常ggplot2會自動根據(jù)輸入變量選擇最優(yōu)的坐標刻度方案雏亚,若要手動設置或調(diào)整,就需要用到標度函數(shù):scale_<MAPPING><KIND>()摩钙,標度函數(shù)構成是scale圖形屬性名稱_標度名稱罢低,如:scale_color_gradient表示對圖形顏色的漸變色進行定義。
標度分類
按照對圖形作用的部分差異胖笛,分為坐標軸標度网持,顏色標度,填充標度长踊,大小標度功舀,透明度標度,線條標度身弊,形狀標度日杈。
常用的標度函數(shù):
- scale_x or y_continuous():用于修改連續(xù)變量坐標軸的刻度和標簽。
- scale_x or y_discrete():修改離散變量坐標軸的標簽佑刷。
- scale_x or y_date():設置日期刻度莉擒。
- scale_x_log10(), scale_x_sqrt(), scale_x_reverse():坐標刻度取對數(shù),開方瘫絮,翻轉(zhuǎn)涨冀。
- scale_x_gradient(), scale_x_gradient2(), scale_x_gradientn():漸變色設置,x可為 color, fill 等麦萤。
7.2.1 坐標軸設置
坐標原點歸位
你會發(fā)現(xiàn)鹿鳖,ggplot2繪制的初始圖形,坐標原點均不是從0開始壮莹,可通過以下方式調(diào)整翅帜。
library(tidyverse) # 調(diào)用tidyverse包。
df <- read_csv("df.csv") # 讀取df數(shù)據(jù)集命满。
p <- ggplot(df, aes(v1, v2)) + geom_point() # 繪制基礎圖形涝滴,定義為p。
p # 顯示圖形胶台。
p + coord_cartesian(xlim = c(0, NA), ylim = c(0, NA)) # 坐標原點歸位歼疮。
p + expand_limits(x = 0, y = 0) # 結(jié)果同上。
p + xlim(c(0, 1.5)) + ylim(c(0, 4.5)) # 也可以通過設置坐標軸刻度范圍讓起始刻度從0開始诈唬。
設置坐標軸范圍
- 通過coord_cartesian()設置xlim和ylim韩脏。
- 通過xlim(c(軸范圍最小值,軸范圍最大值))和ylim(c(軸范圍最小值,軸范圍最大值))。
- 通過scale_y_continuous(limits =c())設置铸磅。
p + coord_cartesian(xlim = c(0, 1.5), ylim = c(0, 4.5)) # 通過coord_cartesian函數(shù)中的xlim和ylim控制x軸和y軸的取值范圍赡矢。
p + xlim(c(0, 1.5)) + ylim(c(0, 4.5)) # xlim和ylim設置軸取值范圍杭朱。
p + scale_x_continuous(limits = c(0, 1.5)) + scale_y_continuous(limits = c(0, 4.5)) # scale_x or y_continuous(limits = )調(diào)整軸取值范圍。
坐標軸翻轉(zhuǎn)
coord_flip(xlim = NULL, ylim = NULL, expand = TRUE)
實現(xiàn)坐標軸翻轉(zhuǎn)吹散,即 x 軸與 y 軸互換痕檬。
ggplot(df, aes(nitrogen, v1)) + geom_col() # 基礎圖形。
ggplot(df, aes(nitrogen, v1)) + geom_col() + coord_flip() # 翻轉(zhuǎn)坐標軸送浊。
scale_x_reverse或scale_y_reverse
實現(xiàn)的是x軸或y軸取值范圍最大最小值的翻轉(zhuǎn)梦谜。
p + scale_x_reverse() # 原來x軸最大值翻轉(zhuǎn)至坐標左下角原來最小值的地方。
p + scale_y_reverse() # 原來y軸最大值翻轉(zhuǎn)至坐標左下角原來最小值的地方袭景。
坐標軸比例縮放
coord_fixed(ratio = 1, xlim = NULL, ylim = NULL, expand = TRUE)
參數(shù)ratio用于指定縱橫比唁桩,也就是縱軸1單位顯示的長度,是橫軸1單位顯示的長度的幾倍耸棒。 默認值為1荒澡,表示x 軸和 y 軸之間的縮放比例為 1:1。 ratio值越小与殃,圖形越扁单山。
p # 基礎圖。
p + coord_fixed() # coord_fixed()函數(shù)調(diào)整縱橫比為1:1幅疼。
p + coord_fixed(ratio = 2) # 縱軸單位顯示長度是橫軸單位顯示長度的2倍米奸。
p + coord_fixed(ratio = 1/2) # 縱軸單位顯示長度是橫軸單位顯示長度的0.5倍。
p + coord_fixed(ratio = 1/10) # 縱軸單位顯示長度是橫軸單位顯示長度的0.1倍爽篷。
p + xlim(c(0, 5)) + ylim(c(0, 5)) + coord_fixed() # 這里將橫軸和縱軸的刻度范圍設置成了一樣悴晰,再調(diào)整坐標軸比例為1:1。
更改分類軸項目順序
scale_x_discrete()或scale_y_discrete():實現(xiàn)圖形分類變量順序變更逐工。
ggplot(df, aes(nitrogen, v1)) + geom_boxplot() # 基礎圖繪制铡溪。
ggplot(df, aes(nitrogen, v1)) + geom_boxplot() + scale_x_discrete(limits = c("N2", "N1")) # 調(diào)整了x分類變量順序。
df$nitrogen <- factor(df$nitrogen,levels = c("N1", "N2"), order = TRUE) # 先設置df數(shù)據(jù)集nitrogen為因子泪喊,因子水平為N1和N2棕硫,讓因子順序為N1和N2。
df$nitrogen # 查看因子袒啼。
ggplot(df, aes(nitrogen, v1)) + geom_boxplot() + scale_x_discrete(limits = rev(levels(df$nitrogen))) # 反轉(zhuǎn)因子順序哈扮。
坐標軸坐標轉(zhuǎn)換
scale_x or y_log10():對x軸或y軸做對數(shù)轉(zhuǎn)換。
scale_x or y_sqrt():對x軸或y軸數(shù)值取平方根瘤泪。
p + scale_x_log10() # 對x軸數(shù)值取對數(shù)灶泵。
p + scale_x_sqrt() # 對x軸數(shù)值取平方根。
參考資料
- R語言編程—基于 tidyverse对途,張敬信,人民郵電出版社(待出版)髓棋,2022.
- R語言教程实檀,李東風惶洲,https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/index.html
- 《R數(shù)據(jù)科學》,人民郵電出版社膳犹,2018.
- ggplot2高效實用指南恬吕,http://www.reibang.com/p/2dc81b91131e
- ggplot2超詳細講解,http://www.reibang.com/p/07f7931a00db
- ggplot保姆級教程-科研繪圖細節(jié)調(diào)參须床,https://zhuanlan.zhihu.com/p/391832351
- 第 23 章 ggplot2之標度铐料,王敏杰,https://bookdown.org/wangminjie/R4DS/tidyverse-ggplot2-scales.html
- R|ggplot2(三)|coord系列函數(shù)坐標軸轉(zhuǎn)換豺旬,https://zhuanlan.zhihu.com/p/29553382