統計R語言實作筆記系列 – 2D資料視覺化入門

R的繪圖套件相當豐富,在「R Graphical Manual」網站上有不少範例可供學習,一般的2D統計圖表自然不在話下,還可以輕易繪製出工程上常用到的3D圖形。此外,R還包含了一些特殊的繪圖功能,像是自訂函數、繪製世界地圖資料、互動式圖表、把圖表輸出到網頁上等等。R的社群經常喜歡把這種跨領域綜合繪圖的能力概稱為「資料視覺化(Data Visualization)」。

資料視覺化的第一課就從常用的圖表開始吧。

常用統計圖表包括了: Histogram、Barplot、Pie、Boxplot、Density Plot、qqplot 等等, R 的許多繪圖函數都能自動分析資料格式,並做出修正或錯誤回報,但並非每次都能順利執行。因此繪製統計圖表時,首先要注意的是資料型態與圖表是否吻合? 例如圖表類型「直方圖(Histogram)」、「圓餅圖(Pie)」應用的情境與限制就很不一樣。

此處以 R 當中內建的範例資料集「 sleep 」、「 islands 」、「 rivers 」為例,方便對照資料與圖表的些哪些部分是彼此對應。

「 sleep 」資料集的格式如下:

r-sleep-資料集

「islands」資料集的格式如下:

r-islands-資料集

「rivers」資料集格式如下:

r-rivers-資料集

接下來依序介紹的幾種基本繪圖函數,每個函數內都有對應的參數可供修改名稱、座標、顏色等選項,讀者除了可連往 R 的說明頁一覽,也可以在 R 中輸入 help(要查詢的函數名稱):
1.直方圖hist()
2.長條圖barplot()
3.圓餅圖pie()
4.盒鬚圖boxplot()
5.機率密度圖plot(density())
6.散佈圖qqplot()

直方圖hist()

直方圖的語法相當簡單:

hist
function (x, …)

其中 X 必須是數值資料,因此在 sleep 資料集中,我們可以用「 $ 」符號抽出 extra 這個欄位來繪圖:

hist(sleep$extra)

r-histogram-直方圖-範例

直方圖中,使用者所輸入的資料 x 固定在 X 軸表示, R 會自動產生適合的座標刻度(如需修改請參考此處),係一組固定間格的區間,而 Y 軸則是會顯示「頻率次數」。

長條圖barplot()

另一個和直方圖相當類似、也經常搞混的圖表是長條圖,基本語法如下:

barplot
function (height, …)

其中 height 必須是向量。我們一樣可以用 sleep 資料集中的 extra 欄位繪圖,好用來比較直方圖與長條圖的差異:

barplot(sleep$extra)

r-bar-plot-長條圖-範例

與直方圖相同, X 座標顯示為之前輸入的資料,但 Y 座標不再顯示「頻率」,而是原本的「數值」,因此長條圖的趨勢有正有負,這便是兩者的主要差異。

若是想看趨勢就選擇長條圖,要了解各區間資料的相對次數就選擇直方圖吧!

圓餅圖pie()

廣受歡迎的圓餅圖,基本語法如下:

pie
function (x, labels = names(x), edges =
200, radius = 0.8, clockwise = FALSE,
init.angle = if (clockwise) 90 else 0, density = NULL, angle = 45,
col = NULL, border = NULL, lty = NULL, main = NULL, …)

不修改外觀與資料呈現的情況下,只需要指定資料x即可。若想要修改顯示的分類名稱,則可以在labels參數給定一組名稱向量來執行。另外,輸入圓餅圖的資料數值必須是正值才行。

此處以「islands」資料為例繪製如下:

pie(islands)

r-pie-chart-圓餅圖-範例

從圖例可以清楚發現圓餅圖的缺點,那就是當分類較多的時候,畫面就會非常雜亂。這時候可以採取兩個做法,一是重新分類,把重要性不足的歸類為「其他」,另一個做法則是只顯示某些特別重要的分類以發現相對關係,但缺點是圓餅圖不再代表全部的資料。

R的pie函數並沒有顯示各分類所佔百分比的選項,但也可以透過以下的做法增加上去。下面的例子示範加上各分類佔比的方法。

pct<-round(islands/sum(islands)*100,3) # 設一新變數pct等於右式: round(x,y)用來四捨五入x中的資料至小數第y位。sum()用來計算總和。islands/sum(islands)*100用來計算各分類的百分比。

lbls<-paste(names(islands),pct,"%") # 設一新變數lbls等於右式: paste()用來合併各元素成一個完整命名,各元素用「,」分隔。names(x)用來取得x中的變數名稱。

pie(pct, labels=lbls) # 以pct為資料繪製圓餅圖, 並將分類名稱指定為lbls的名稱

現在圖中可以看到比例說明了:
r-pie-chart-圓餅圖-範例2

為了讓圓餅圖看起來比較簡潔可閱讀,可以利用「[ ]」符號來篩選特定條件的資料,但是必須注意「labels」也要一併改寫篩選,否則圓餅的命名將會出現與資料不符的情況!

pct2<-pct[pct5] # 設一新變數pct2,為pct中大於5的資料集合。

pct2
Africa    Antarctica          Asia        Europe North America
19.13          9.15         28.25          6.23         15.62
South America
11.30
# pct2篩選出來的結果,單位是百分比。

lbls2<-paste(names(pct2),pct2,"%") # 設一新變數lbls2等於右式: paste()用來合併各元素成一個完整命名,各元素用「,」分隔。names(x)用來取得x中的變數名稱。

lbls2
[1] “Africa 19.13 %"        “Antarctica 9.15 %"     “Asia 28.25 %"
[4] “Europe 6.23 %"         “North America 15.62 %"
“South America 11.3 %"
# lbls2的內容。

重新繪製新的圓餅圖如下:

pie(pct2, labels=lbls2)

r-pie-chart-圓餅圖-範例3

盒鬚圖boxplot()

boxplot
function (x, …)

仍以 sleep 資料集為例,繪製盒鬚圖如下:

boxplot(sleep)

r-boxplot-盒鬚圖-範例

核估計機率密度圖plot(density())

density 函數本身並不是繪圖函數,而是計算()內資料的「核密度估計( Kernel Density Estimation )」,如果再把 density() 放入繪圖函數 plot() 中,就可以畫出機率密度函數了。

核估計下的機率密度是一種非參數估計的平滑曲線,做個簡單類比,把直方圖的每個長條切得很細很細,再把長條頂端的中點畫線連起來,大略就是核估計機率密度圖的樣子。

繪製密度圖可以簡易了解資料的機率分佈,這對於選擇合適的統計模型是重要的前置資訊。以sleep資料集裡面的數值資料extra變數為例,繪製機率密度圖如下:

plot(density(sleep$extra))

r-density-plot-核估計機率密度-範例

散佈圖qqplot()

散佈圖是一種常用來了解兩個變數之間相關性的圖,它的基本語法如下:

function (x, y, plot.it = TRUE, xlab = deparse(substitute(x)), ylab = deparse(substitute(y)), …)

以 sleep 資料集中的 extra 變數與 rivers 資料繪製散佈圖如下:

qqplot(sleep$extra,rivers)

r-散佈圖-範例

輔助線: abline()、lines()

製作圖表時,輔助線有時對於詮釋資料相當有幫助。其中「 abline() 」是最基本好用的函數,它的語法如下:

abline
function (a = NULL, b = NULL, h = NULL, v = NULL, reg = NULL, coef = NULL, untf = FALSE, …)

其中主要用到參數有: 參數a是截距,參數b是斜率,參數h是畫水平線時的高度,參數v是畫垂直線時的位置。

輸入 abline 函數時, R 會自動在現有的圖上加畫輔助線,而且不限輔助線數量。當然也可以輸入迴歸公式來繪製迴歸線。

以剛才的 qqplot(sleep$extra,rivers) 圖為例,加畫水平與垂直的輔助線:

abline(h=1600,v=1.75)

r-abline-範例

除此之外,機率密度函數也可以作為輔助線加在原本的圖表上。以最開始的直方圖 hist(sleep$extra) 為例,運用「 lines() 」加上「 density() 」的組合繪製輔助線:

lines(density(sleep$extra))

r-density-abline-範例

繪製機率密度函數當成輔助線的一個問題是如果 Y 座標刻度相差太多,那麼輔助線就不容易看,除了直方圖以外(因為 Y 軸不論有無標準化都是顯示發生頻率),其它圖表則可以嘗試透過標準化原始資料再重新繪圖的方式來改善。

把多張圖表放進同一個繪圖視窗: par(mfrow=c(x,y))

前面的繪圖方式都是一次產生一張圖,輸入新的函數之後前面的圖就會被蓋掉。透過「 par() 」加上「 mfrow=c() 」的簡單操作,R也可以讓使用者保留多張圖在同一個畫面。

舉例來說,想要讓R的繪圖視窗切割成 3 X 3 的方塊,那麼就可以使用以下指令:

par(mfrow=c(3,3))

接著重新把要讓入的繪圖函數一一輸入,畫面就會像這個樣子:

hist(sleep$extra)
barplot(sleep$extra)
pie(pct2, labels=lbls2)
boxplot(sleep)
plot(density(sleep$extra))
qqplot(sleep$extra,rivers)
barplot(rivers)

r-grid-多張圖-範例

萬用的Plot()函數

在 R 當中有一個相當有名的函數「 plot() 」,整合了各種基本繪圖,而且能夠依據資料格式自動選擇對應的圖表優先輸出。更強大的是,當輸入「 data.frame() 」格式的資料時, plot 函數會自動產生 R x C 的散佈矩陣。

以 sleep 資料集為例,繪製散佈矩陣如下:

plot(sleep)

r-matrix-範例

在 plot 中,用來控制圖表類型的參數是「 type 」,詳細內容可以參考 R 網站的說明。

依序繪製如下:

par(mfrow=c(3,3)) #先切割圖表輸出為3 X 3
plot(sleep$extra,type="p") # 點圖
plot(sleep$extra,type="l") # 線圖
plot(sleep$extra,type="c") # 線圖去除資料點
plot(sleep$extra,type="o") # 線圖加上資料點
plot(sleep$extra,type="h") # 長條圖
plot(sleep$extra,type="s") # 階梯圖
plot(sleep$extra,type="n") # 空白圖

r-plot-範例

不論是 plot() 或是前述的各種繪圖函數,裡頭都帶有改變外觀、線條與顏色的參數,最後以 plot 為例,把常用的調整參數整理如列表:

點的形狀
plot(x, pch=1~4)
#1是圓形、2是三角形、三是+號、四是-號, 更多看此

字體大小
plot(x, cex=數字)
# 預設為1。
plot(x, cex.axis=數字)
# 指定座標字體大小。
plot(x, cex.labels=數字)
# 指定文字標籤字體大小。

圖形顏色
plot(x, col=數字)
# 顏色編號可查此

線的種類
plot(x, lty=數字)
#有六種基本實虛線,更多組合可查此

線的粗細
plot(x, lwd=數字)
#預設為1

座標軸
plot(x, xlim=c(數字1,數字2), ylim=c(數字1,數字2))
#指定XY軸的起始點與終止點

更多精彩內容,千萬別錯過:

* 統計R語言實作筆記系列 – 2D視覺化進階 GGPLOT()的基本架構(一)

* 統計R語言實作筆記系列 – 用 SHINY 套件極速打造你的商業智慧分析網站!

* 統計R語言實作筆記系列- 直線ABLINE()、曲線CURVE()與多邊形POLYGON()

* 統計R語言實作筆記系列 – 2D視覺化入門

* EXCEL 交互參照必學神器, 用 LOOKUP 系列函數一鍵搞定資料比對 : HLOOKUP篇

(Visited 4,925 times, 40 visits today)

Wendell.Huang

科技公司嫌棄太活潑,消費品牌挑剔太沉悶..., 經常必須解釋自己在學什麼, 不小心就摔破對方眼鏡的跨領域玩家。