標籤:

入門 ggplot2 的圖形語法

原創 2017-06-25 安建才 EasyCharts

前言

作者:安建才

知乎:安建才 - 知乎

歡迎關注支持!

本文首發於作者知乎,

已獲作者授權以原創形式發布!

原文鏈接戳文末【閱讀原文】

ggplot2 包是 Hadly Wickham 開發(除 ggplot2 外,還有 plyr 和 reshape2 包)的一款通過 「+」,以圖層疊加的搭配組合,易於實現數據可視化的 R 包。ggplot2 以美輪美奐的統計製圖能力位居各類繪圖軟體排名前列,同時此包功能也在增加。此文簡單介紹 ggplot2 的基本原理和操作,便於大家對 ggplot2 快速入門。

ggplot() 作為泛型函數(gplot() 能快速作圖,卻不是泛型函數),能對任意類型的 R 對象進行可視化操作,這是 ggplot2 的精髓所在。

在 Hadly 的 ggplot2 官方文檔中,Hadely 這樣對 Wilkinson 的圖形語法進行了描述:「一張統計圖形就是從數據到集合對象(geometric object, 縮寫為 geom,包括點、線、條形等)的圖形屬性(aesthetic attributes, 縮寫為 aes, 包括顏色、形狀、大小等)的一個映射。此外,圖形中還可能包含數據的統計變換(statistical transformation, 縮寫為 stat),最後繪製在某個特定的坐標系(coordinate system, 縮寫為 coord)中,而分面(facet, 指將繪圖窗口劃分為若干個子窗口)則可以用來生成數據中不同子集的圖形。」 因此,在 ggplot2 中,圖形語法中至少包括了如下幾個圖形部件:

1、 數據(data)

2、 映射(mapping)

3、 幾何對象(geom)

4、 統計變換(stat)

5、 坐標系(coord)

6、 分面(facet)

7、 標度(scale)

這些組件之間用 「+」,以圖層(layer)的方式來粘合構圖的,所以圖層是 ggplot2 中一個重要的概念;在掌握基本的圖形部件基礎上,要完成一幅高質量的統計繪圖,仍然需要其他圖形部件來進一步擴展,這包括了:

8、 主題(theme)

9、 位置(position)

10、存儲和輸出

接下來將對上述概念展開講述

1、在 ggplot2 中,所接受的數據集必須為數據框(data.frame)格式。

如內置的 mtcars 數據集:head(mtcars)

2、這種數據框的格式好處是數據易於存儲,也能保留原有的繪圖參數下,用 %+% 方便地變更已有數據集。如:

library(ggplot2)np <- ggplot(mtcars,aes(mpg,wt,colour=cyl))+geom_point()npn

mtcarsc <- transform(mtcars,mpg = mpg^2)np %+% mtcarscn

3、 ggplot2 進行數據分組時必須根據行, 而不能根據列。 例如在 mtcars 的數據集中, 可以把汽車按汽缸數進行分組, 但不能按汽車的檔位數和汽缸數這兩個變數分為兩組。這要求把 「寬」 數據轉化為 「長」 數據。所謂的長數據是變數不在是放在各個列上, 而是排成一列, 每一個變數都分別占其中的幾行, 這樣就能方便的對每個變數進行分組。reshape2中 melt() 和 cast() 能夠靈活的融合 (melt)重鑄 (cast) 在數據框中的數據。如:

library(reshape2)nmtcarsm <- melt(mtcars, id = c("mpg","disp","hp","drat","wt","qsec","vs","carb"))nhead(mtcarsm)n

1、 概念

aes() 函數是 ggplot2 中的映射函數, 所謂的映射即為數據集中的數據關聯到相應的圖形屬性過程中一種對應關係, 如:

p1 <- ggplot(data = mtcars)nsummary(p1)n

p2 <- ggplot(data = mtcars, mapping = aes(x = wt, y = hp, color = gear))nsummary(p2)n

發現, 在 p2 中, 通過 aes() 指定了橫縱坐標分別為 wt 和 hp、 顏色為 gear 這三種圖形屬性。 在 ggplot2 中不同的幾何對象對應著不同的圖形屬性。

2、 設定和映射

映射是將一個變數中離散或連續的數據與一個圖形屬性中以不同的參數來相互關聯, 而設定能夠將這個變數中所有的數據統一為一個圖形屬性。如:

p <- ggplot(mtcars, aes(wt, mpg))n#設定散點的顏色為藍色np + geom_point(color = "blue")n

3、 分組(group)

分組也是 ggplot2 種映射關係的一種, 默認情況下 ggplot2 把所有觀測點分為了一組, 如果需要把觀測點按額外的離散變數進行分組處理, 必須修改默認的分組設置。

p3 <- ggplot(data = mtcars, mapping = aes(x = wt, y = hp)) + geom_line()np3n

p4 <- ggplot(data = mtcars, mapping = aes(x = wt, y = hp, group = factor(gear))) + geom_line()np4n

幾何對象執行著圖層的實際渲染, 控制著生成的圖像類型。例如用 geom_point() 將會生成散點圖, 而 geom_line 會生成折線圖。幾何對象如下:

具體應用如:

p <- ggplot(mtcars, aes(wt, mpg))np + geom_point()n

#更改顏色-連續變數np + geom_point(aes(color = qsec))n

#更改顏色-離散變數np + geom_point(aes(color = factor(gear)))n

#更改透明度np + geom_point(aes(alpha = qsec))n

#更改形狀np + geom_point(aes(shape = factor(gear)))n

#更改點大小np + geom_point(aes(size = qsec))n

#兩種顏色的疊加np + geom_point(color = "grey50", size = 5) + geom_point(aes(color = qsec), size = 4)n

#顏色和形狀的疊加np +geom_point(color = "grey50", size = 5) + geom_point(aes(shape = factor(gear)), size = 3)n

統計變換即對數據進行統計變化, 通常以某種方式對數據信息進行匯總, 例如通過 stat_smooth() 添加光滑曲線。統計對象如下:

每一個幾何對象都有一個默認的統計變換, 並且每一個統計變換都有一個默認的幾何對象。正因如此, 這一設定將會使繪圖過程變的靈活多變。

具體應用如:

m <- ggplot(mtcars, aes(qsec, wt))nm + stat_smooth() + geom_point()n

#取消默認的置信區間nm + stat_smooth(se = FALSE) + geom_point()n

#更改置信區間和線條顏色nm + stat_smooth(fill = "red", size = 2, alpha = 0.5, color = "green") + geom_point()n

#用一元一次線性方程擬合nm + stat_smooth(method = "lm") + geom_point()n

#使用一元二次方程擬合nm + stat_smooth(method = "lm", formula = y ~ poly(x, 3)) + geom_point()n

#按cyl這個離散變數進行分組, 分別擬合數據m <- ggplot(mtcars, aes(y = wt, x = mpg, group = factor(cyl)))nm + stat_smooth(method = lm, aes(color = factor(cyl), fill = factor(cyl))) + geom_point( aes(color = factor(cyl)))n

在上述對數據和映射的講解中, 已經採用過」+」 來添加圖層,可以這樣理解 ggplot2 中的圖層:每個圖層可以代表一個圖形組件, 如已經介紹的幾何對象、統計變換等圖形組件, 這些組件以圖層的方式疊加在一起構成一個繪圖的整體;在每個圖層中的圖形組件又可以分別設定數據、映射或其他相關參數, 因此組件之間又是具有相對獨立性的。ggplot2 中圖層的設定是十分成功的, 因為這一過程是如此實用、方便而富有邏輯性。

在幾何對象中設定映射

前面已在 ggplot() 中設定了映射了關係, 這種映射關係是默認的, 我們可以在後面的幾何對象中沿用已設定的默認映射關係, 也可以隨時在幾何對象中進行更改。

#設定默認的映射關係np <- ggplot(mtcars, aes(x = mpg, y = wt, color = factor(gear)))n#沿用默認的映射關係來繪製散點圖np + geom_point()n

#添加圖層中的shape的映射關係np + geom_point(aes(shape = factor(carb)))n

#修改默認的y的映射關係, 注意圖中y軸名稱仍然以默認的wt表示np + geom_point(aes(y = carb))n

#刪除默認的color映射關係np + geom_point(aes(color = NULL))n

即在一個頁面上自動擺放多幅圖形, 這一過程先將數據劃分為多個子集, 然後將每個子集依次繪製到頁面的不同面板中。ggplot2 提供兩種分面類型:網格型 (facet_grid)封面型 (facet_wrap)網格分面生成的是一個 2的面板網格, 面板的行與列通過變數來定義, 本質是 2的; 封裝分面則先生成一個 1的面板條塊, 然後再分裝到 2中, 本質是 1的。分面函數如下:

在很多情況下, 我們可能需要繪製有兩個 y 軸的坐標系, 而在 ggplot2 中, 這種做法特別不提倡, 可解決的方法要麼是把變數歸一化, 要麼便是採用分面方法。如:

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()n#以cyl為分類變數np + facet_grid(. ~ cyl)n

#wrap與grid的區別np + facet_wrap( ~ cyl, nrow = 3)n

p + facet_wrap( ~ cyl, ncol = 3)n

p <- p + geom_smooth(method = "lm", se =F, aes(color = factor(cyl))) + geom_point(aes(color = factor(cyl)))np + facet_grid(vs ~ am)n

主題系統控制著圖形中的非數據元素外觀, 它不會影響幾何對象和標度等數據元素。主題修改是一個對繪圖精雕細琢的過程, 主要對標題、坐標軸標籤、圖例標籤文字調整, 以及網格線、背景、軸須的顏色搭配。

標度控制著數據到圖形屬性的映射, 更重要的一點是標度將我們的數據轉化為視覺上可以感知的東西, 如大小、顏色、位置和形狀。所以通過標度可以修改坐標軸和圖例的參數。標度函數如下:

位置函數

坐標系函數

經過以上過程講述,對 ggplot2 中的圖形語法有了基本了解,根據繪製圖形的效果可進行相對應的調參。

ggplot2 入門與進階:ggplot2入門與進階(上) | 塞邇斯

R--ggplot2 包介紹學習:R----ggplot2包介紹學習 - Little_Rookie - 博客園

aHR0cDovL3FtLnFxLmNvbS9jZ2ktYmluL3FtL3FyP2s9cEYyVjdtVExWZzdwQ09FakNMdjVBQWNEeGRXS0tfQVA= (二維碼自動識別)

aHR0cDovL3N0dWR5LjE2My5jb20vY291cnNlL2NvdXJzZU1haW4uaHRtP2NvdXJzZUlkPTEwMDM1OTIwMDg= (二維碼自動識別)

aHR0cDovL3dlaXhpbi5xcS5jb20vci8wVDhYRDVmRVY4b29yZE5zOTJyRA== (二維碼自動識別)

如需轉載請聯繫EasyCharts團隊!

EasyCharts團隊出品

帥的人都關注了EasyCharts團隊^..^~

QQ交流群:553270834

微信公眾號:EasyCharts

更多信息敬請查看: easychart.github.io/pos


推薦閱讀:

第二篇——用幾分鐘了解R語言入門知識(續)
第二講實踐:數據結構入門
2017.07大數據入門學習計劃
編寫R語言的樂趣 --第二關:數據結構入門
HR Analyse

TAG:R编程语言 |