[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()

幾何對象將在下面的小節介紹,這一節,關注的是數據和圖形屬性之間的映射。如果想將切工(cut)映射到形狀屬性。只需要:

p

再比如我想將鑽石的顏色(color)映射顏色屬性:

p

幾何對象(Geometric)

在上面的例子中,各種屬性映射由 ggplot() 函數執行,只需要加一個圖層,使用 geom_point() 告訴 ggplot() 要畫散點圖,於是所有的屬性都映射到散點上。geom_point() 完成的就是幾何對象的映射,ggplot2 提供了各種幾何對象映射,如 geom_histogram() 用於直方圖,geom_bar() 用於畫柱狀圖,geom_boxplot() 用於畫箱式圖等等(後期博主會寫一篇用 ggplot2 畫各種圖的文章,這裡只簡單列舉幾個)。 注意:不同的幾何對象,要求的屬性會有些不同,這些屬性也可以在幾何對象映射時提供,比如上一個圖,也可以用以下語法來畫:

p

ggplot2 支持圖層,我通常把不同的圖層中共用的映射提供給 ggplot() 函數,而某一幾何對象才需要的映射參數提供給 geom_xxx() 函數。

直方圖

直方圖最容易,提供一個 x 變數,畫出數據的分布。

ggplot(data=small, mapping=aes(x=price))+geom_histogram()

同樣可以根據另外的變數給它填充顏色,比如按不同的切工:

ggplot(data=small, mapping=aes(x=price, fill=cut))+geom_histogram()

柱狀圖

柱狀圖非常適合於畫分類變數。在這裡以透明度(clarity)變數為例。按照不同透明度的鑽石的數目畫柱狀圖。

ggplot(data=small, mapping=aes(x=clarity))+geom_bar()

柱狀圖兩個要素,一個是分類變數,一個是數目,也就是柱子的高度。數目在這裡不用提供,因為 ggplot2 會通過 x 變數計算各個分類的數目。

密度函數圖

說到直方圖,就不得不說密度函數圖,數據和映射和直方圖是一樣的,唯一不同的是幾何對象,geom_histogram 告訴 ggplot 要畫直方圖,而 geom_density 則說我們要畫密度函數圖,在我們熟悉前面語法的情況下,很容易畫出:

ggplot(data=small, mapping=aes(x=price, colour=cut))+geom_density()

你也可以根據另外的變數給它填充顏色,比如按不同的切工:

ggplot(data=small, mapping=aes(x=price, fill=clarity))+geom_density()

colour 參數指定的是曲線的顏色,而 fill 是往曲線下面填充顏色。

其他

&emsp ggplot2 提供了很多的 geom_xxx 函數,可以滿足我們對各種圖形繪製的需求。

| 函數名稱 | 描述 | | ---------------- | --------------------------------------- | | geom_abline | 線、由斜率和截距決定 | | geom_area | 面積圖 | | geom_bar | 條形圖、以 x 軸為底的矩形 | | geom_bin2d | 二維熱圖 | | geom_blank | 空白,什麼都不畫 | | geom_boxplot | 箱線圖 | | geom_contour | 等高線圖 | | geom_crossbar | 帶有水平中心線的盒子圖 | | geom_density | 光滑密度曲線圖 | | geom_density2d | 二維密度登高線圖 | | geom_dotplot | 點直方圖,用點來表示觀測值的個數 | | geom_errorbar | 誤差棒 | | geom_errorbarh | 水平的誤差棒 | | geom_freqpoly | 頻率多邊形圖 | | geom_hex | 用六邊形表示的二維熱圖 | | geom_histogram | 直方圖 | | geom_hline | | 水平線 | | geom_jitter | 給點添加擾動,減輕圖形重疊問題 | | geom_line | 按照 x 坐標的大小順序依次連接各個觀察值 | | geom_lineranger | 一條線代表一個區間的豎直線 | | geom_map | 基準地圖裡的多邊形 | | geom_path | 按數據的原始順序連接各個觀察值 | | geom_point | 點,用點來繪製散點圖 | | geom_pointranger | 用一條中間帶點的豎直線代表一個區間 | | geom_polygon | 多邊形,相當於一個有填充的路徑 | | geom_quantile | 添加分位數回歸線 | | geom_raster | 高效的矩形瓦片圖 | | geom_rect | 二維的矩形圖 | | geom_ribbon | 色帶圖,連續的 x 值所對應的 y 的範圍 | | geom_rug | 邊際地毯圖 | | geom_segment | 添加線段或箭頭 | | geom_smooth | 添加光滑的條件均值線 | | geom_text | 文本注釋 | | geom_tile | 瓦片圖 | | geom_violin | 小提琴圖 | | geom_vline | 豎直線 |

標尺(Scale)

前面我們已經看到了,畫圖就是在做映射,不管是映射到不同的幾何對象上,還是映射各種圖形屬性。這一小節介紹標尺,在對圖形屬性進行映射之後,使用標尺可以控制這些屬性的顯示方式,比如坐標刻度,可能通過標尺,將坐標進行對數變換;比如顏色屬性,也可以通過標尺,進行改變。

ggplot(data=small, mapping=aes(x=carat, y=price, shape=cut, colour=color))+geom_point()+scale_y_log10()+scale_colour_manual(values=rainbow(7))

以數據(Data)和映射(Mapping) 一節中所畫散點圖為例,將 Y 軸坐標進行 log10 變換,再自己定義顏色為彩虹色。

入門教程(下)

有時間再寫後面的內容。

原文鏈接

原文鏈接。點擊查看博主的個人網站,查看其他效率軟體的介紹。


推薦閱讀:
相关文章