ggplot2 科學繪圖之入門教程(上)
[toc]
前言
能夠進行科學繪圖的軟體很多很多,我身邊的同學有用 Matlab 的,有用 Python 的,有用 Origin 的,當然也有用 Excel 的。博主之所以採用 R 畫圖,主要是前面幾個做出來的圖實在是不忍直視(博主顏控,Python 好一點)。其實 R 的基礎包裡面也有很多畫圖函數,例如 plot ()
、barplot ()
、qqplot ()
等, 但是 ggplot2 包的函數畫出的圖比較漂亮,而且使用靈活。 博主沒有採用大家最常用的 RStudio 編輯器,而是採用了 VSCode 這款編輯器。VSCode 是博主最喜歡的編輯器之一,可以寫各種各樣的語言,它經常出現在我的文章里,點擊鏈接查看本站關於它的介紹。為了讓你更好的體驗 VSCode 寫 R 語言的快感,點擊本站文章 —— 用 VSCode 愉快地寫 R,進行相關配置。
ggplot2 簡介
ggplot2 是 R 語言中最優秀的繪圖包(目前在 Python 中也已經可以使用,不過 Python 中使用的是 ggplot,低級版本的 ggplot2),也可以說是目前最優秀的繪圖工具之一。這得益於 Leland Wilkinson 在他的著作《The Grammar of Graphics》中提出了一套圖形語法,把圖形元素抽象成可以自由組合的成分,Hadley Wickham 把這套想法在 R 中實現。 順道提一下 ggplot2 名字的由來。ggplot2 這個術語需要進行拆詞:ggplot2=gg+plot+2
:其中的 gg
是《Grammer of Graphics》這本書的英文縮寫;plot
是繪圖的英文單詞;2
顧名思義就是第二代的意思了。所以 ggplot2 就是指基於圖形語法的第二代繪圖包。 因為 ggplot2 是基於圖形語法這本書,因此 ggplot2 中的繪圖是基於圖層概念,這與其它繪圖系統存在很大不同。其它繪圖系統是直接出圖,然後再對圖形的不同部分進行格式調整,但是 ggplot2 繪圖就是典型的堆積木,按照你的想法把各個要素添加到畫布之上,這一點相信學過 Photoshop 的同學肯定很熟悉。所以 ggplot2 繪圖的本質就是數據到圖形屬性的映射。這裡有必要先和大家說一下 ggplot2 繪圖中的一些基本要素。
安裝 ggplot2 包
使用 install.packages("ggplot2")
命令即可安裝。
ggplot2 基本要素
基本要素有:
- 數據(Data)和映射(Mapping)
- 幾何對象(Geometric)
- 標尺(Scale)
- 統計變換(Statistics)
- 坐標系統(Coordinante)
- 圖層(Layer)
- 分面(Facet)
- 主題(Theme)
這些基本要素之間是通過 +
連接,以圖層 (layer) 的方式來粘合構圖的,所以圖層是 ggplot2 中一個重要的概念。 因為本文屬於一篇先導文章,所以就不對這些概念進行系統介紹,而是簡單地介紹這些概念的運用(介紹概念很麻煩的,不如在實踐中自己理解)。
數據(Data)和映射(Mapping)
下面以一份鑽石的數據為例,這份數據非常大,隨機取一個子集來畫圖:
r$> require(ggplot2)
r$> data(diamonds)
r$> set.seed(42)
r$> small head(small)
# A tibble: 6 x 10
carat cut color clarity depth table price x y z
1 0.71 Very Good H SI1 62.5 60 2096 5.68 5.75 3.57
2 0.79 Premium H SI1 61.8 59 2275 5.97 5.91 3.67
3 1.03 Ideal F SI1 62.4 57 6178 6.48 6.44 4.03
4 0.5 Ideal E VS2 62.2 54 1624 5.08 5.11 3.17
5 0.27 Ideal E VS1 61.6 56 470 4.14 4.17 2.56
6 0.3 Premium E VS2 61.7 58 658 4.32 4.34 2.67
r$> summary(small)
carat cut color clarity depth table price x y z
Min. :0.2200 Fair : 28 D:121 SI1 :258 Min. :55.20 Min. :50.10 Min. : 342.0 Min. :3.850 Min. :3.840 Min. :2.330
1st Qu.:0.4000 Good : 88 E:186 VS2 :231 1st Qu.:61.00 1st Qu.:56.00 1st Qu.: 989.5 1st Qu.:4.740 1st Qu.:4.758 1st Qu.:2.920
Median :0.7100 Very Good:227 F:164 SI2 :175 Median :61.80 Median :57.00 Median : 2595.0 Median :5.750 Median :5.775 Median :3.550
Mean :0.8187 Premium :257 G:216 VS1 :141 Mean :61.71 Mean :57.43 Mean : 4110.5 Mean :5.787 Mean :5.791 Mean :3.572
3rd Qu.:1.0700 Ideal :400 H:154 VVS2 : 91 3rd Qu.:62.50 3rd Qu.:59.00 3rd Qu.: 5495.2 3rd Qu.:6.600 3rd Qu.:6.610 3rd Qu.:4.070
Max. :2.6600 I:106 VVS1 : 67 Max. :72.20 Max. :65.00 Max. :18795.0 Max. :8.830 Max. :8.870 Max. :5.580
J: 53 (Other): 37
畫圖實際上是把數據中的變數映射到圖形屬性上。以克拉 (carat) 數為 X 軸變數,價格 (price) 為 Y 軸變數。
r$> p
上面這行代碼把數據映射 XY 坐標軸上,需要告訴 ggplot2,這些數據要映射成什麼樣的幾何對象,下面以散點圖為例:
p + geom_point()