[R Lang] R Lang與高級醫學統計學(5)
Adrian Chen

這篇文章講資料的視覺化分析。

繪圖套件 ggplot2

ggplot2是一套龐大且強大的繪圖系統。其概念是使用結構性語法,先指定資料,再指定變數,然後指定幾何元素,最後處理標題與標註資料以及背景的主題樣式。這個處理模式幾乎等同於在Excel等試算表類統計軟體中的處理模式。

ggplot2的繪圖元件

  1. 資料(data):繪圖的資料來源,一般會先使用ggplot()來輸入資料。
  2. 幾何元件(geometry):繪圖的類型,例如柱狀圖、散佈圖、盒鬚圖等。
  3. 座標系統(coordinate system):繪圖的座標系統,預設是coord_cartesian(),即笛卡兒座標系。

ggplot2的語法結構

ggplot2的語法結構一般遵循下面:

1
2
3
4
5
6
7
8
9
10
ggplot(data = $data) +
$geom_function(
mapping=aes($mappings),
stat=$stat,
position = $position
) +
$coordinate_function +
$facet_function +
$scale_function +
$theme_function

以ggplot2繪製的徒刑必須要包含至少兩個必要的元件——ggplot(data)geom_funtion(mapping)

ggplot2繪圖入門示例

雙變數

我們使用R Lang內建的資料集mpg來進行練習。mpg是1999年到2008年之間38個流行車型的燃油經濟資料。

我們假設要繪製一個散佈圖,x變數和y變數分別是displ(發動機排氣量)和hwy(高速油耗)。那麼我們的程式碼如下:

1
2
library(ggplot2) # 載入ggplot2套件
ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy)) # 使用ggplot()函式載入mpg資料,使用geom_point()函式來繪製散佈圖

繪製結果如下:

ggplot2.1

三個及以上變數

如果我們需要繪製三個以上的變數,我們可以使用顏色來區分:

1
2
library(ggplot2)
ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, color = class))

繪圖結果如下:

ggplot2.2

套用多個幾何元件圖層

我們可以將多個繪圖元件作為不同的圖層疊加在一起:

1
ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, color = class)) + geom_smooth(mapping = aes(x = displ, y = hwy))

繪圖如下:

ggplot3

回歸模型的套用

我們也能在 ggplot2 中套用不同的統計模式,像是迴歸模型(regression models)。假設我們想求得發動機排氣量和高速油耗之間的關聯性,可以使用簡單線性迴歸,類似在上面使用 geom_smooth()的方式,只需要加上 method = “lm” 即可(lm 代表 linear regression),繪圖的時候 ggplot2 也會自動預設加上信賴區間。

1
ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, color = class)) + geom_smooth(mapping = aes(x = displ, y = hwy), method = "lm")

geom_smooth()預設支援常用的幾種回歸模式。例如線性回歸(lm)、廣義線型模型(glm)、廣義加成模型(gam),還可以自定義模型。例子如下,使用這個自定義方程。

1
2
ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, color = class)) +
geom_smooth(mapping = aes(x = displ, y = hwy), method = "lm", formula = y ~ x^2 + exp(x))

繪圖如下:
ggplot4

套用不同的主題

要套用不同的主題,調用不同的主題函式即可。

1
2
3
ggplot(data = mpg) + 
geom_point(mapping = aes(x = displ, y = hwy, color = class)) +
theme_bw()

aes或geom_$function引數

  • x:設定x變數。
  • y:設定y變數。
  • alpha:透明度。數值為0~1。學習前端的讀者應該會很好理解。
  • color:前景顏色,可以使用顏色的英文或者16進位碼。
  • fill:背景顏色。
  • linestyle:線條的類型,0~6代碼分別為:空白(blank)、實線(solid)、虛線(dashed)、點線(dotted)、點虛線(dotdash)、長虛線(longdash)、雙虛線(twodash)
  • size:線條粗細
  • shape:圖形類別,0~16
  • weight:權重

排列位置調整

排列方式會有分散排列(dodge)、填滿在某個元件之中(fill)、堆疊(stack)、分散點排列(jitter)、推移(nudge)等。

1
2
3
## 預設為stack
ggplot(data = mpg, mapping = aes(fl, fill = drv)) +
geom_bar()

ggplot5

1
2
3
## 修改position為dodge
ggplot(data = mpg, mapping = aes(fl, fill = drv)) +
geom_bar(position = 'dodge')

ggplot6

1
2
3
## 修改position為fill
ggplot(data = mpg, mapping = aes(fl, fill = drv)) +
geom_bar(position = 'fill')

ggplot7

加入誤差棒

有時候在繪圖的時候,我們會在圖上面加註誤差棒,以了解數據的誤差範圍。若誤差棒的長度愈長,代表其誤差愈大。誤差棒的長度一般是標準差(standard deviation)或標準誤(standard error)。ggplot2 可使用geom_errorbar(), geom_linerange(), geom_pointrange()geom_crossbar() 等。

各種統計用圖的資料類型一覽

變數數目 變數類型 圖形類型 ggplot2幾何元件 解釋與適用資料
1 連續 直方圖 geom_histogram() 觀察數據分佈的大致情況,應用在連續性的數值上
1 連續 多邊圖 geom_freqpoly() 觀察數據分佈的大致情況,和直方圖很類似,只不過繪製成折線,適合疊加多個變數後比較
1 連續 點圖 geom_dotplot() 觀察數據分佈的大致情況,和直方圖很類似,只不過以點來呈現
1 連續 核密度估計圖 geom_density() 觀察數據分佈的大致情況,將直方圖轉換成折線方式呈現,使用機率密度的函數來計算繪製
1 連續 分位圖 geom_qq, geom_qq_line() 適用於監測數據分佈是否常態
1 連續 盒鬚圖 geom_boxplot() 了解資料的分散狀況,可從盒鬚圖中觀察出中位數、四分位數和最大最小值
1 離散 柱狀圖/長條圖 geom_bar() 比較一個變數小規模的資料分析,適用於離散型資料
2 連續 散佈圖 geom_point 將兩個變數以點呈現,可協助瞭解兩者之間有無關聯,可搭配geom_smooth()
2 連續 面積圖 geom_area()
2 連續 折線圖 geom_line() 連續性的資料,把所有的點用線段連結起來,觀察x軸的變數序列上y的變化情形
2 連續 鬚軸圖 geom_rug() 在兩個軸上精簡表示兩個連續變數的圖,通常適合小資料集
2 連續 平滑曲線圖 geom_smooth() 把所有的資料平滑化後繪製,一般協助觀察並找出資料的特徵
2 連續 + 離散 柱狀圖 geom_col()
2 連續 + 離散 盒鬚圖 geom_boxplot() 了解資料的分散狀況,可從盒鬚圖中觀察出中位數、四分位數和最大最小值
2 連續 + 離散 提琴圖 geom_violin() 同時顯示數據分布和其機率密度,結合盒鬚圖和核密度估計圖
3 連續 等高線圖 geom_contour(), geom_contour_fill() GIS地形高度資料
3 連續 影像網格 geom_raster() 地圖資料,和 geom_tile() 與 geom_rect() 相同,當所有的圖磚大小相同時,繪製地圖的效率較 geom_tile() 或 geom_rect() 來得高
3 連續 圖磚 geom_tile(), geom_rect() 繪製矩形範圍,定義邊界(數值範圍四個角落,geom_rect)或圖磚大小(geom_tile)。通常使用作為地圖上或熱點圖的資料呈現