iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 19
0
自我挑戰組

新手 R 語言學習紀錄系列 第 19

Day 19- R語言 基礎繪圖函數整理 Part 2

  • 分享至 

  • xImage
  •  

Day 19- R語言 基礎繪圖函數整理 Part 2
(前言:內個,我只是個剛接觸程式設計的小萌新,如果內文內容或程式碼寫的不對,還請各位大大指教 Orz)

昨天學習了莖葉圖、點圖及盒型圖,今天要繼續學習直方圖、常態機率分佈圖及等高線圖。

4. 直方圖 (Histogram)
直方圖可以展示連續資料的分佈。直方圖的x軸代表是值域的分組,y軸是該區間的資料筆數。直方圖的函數寫法為:hist(變數或向量名稱, 其他引數(請見documentation))

假設我們有一個data frame叫smolroundtea,有三個列 (lib,lib2,lib3),各50筆資料,要繪製直方圖時可以用下列程式碼:

par(mfrow = c(2,1), mar = c(4,4,2,2)) #自訂繪圖輸出型式
lib <- sample(1:1000, 50, replace = FALSE) #三筆資料
lib2 <- sample(1:1000, 50, replace = FALSE)
lib3 <- sample(1:1000, 50, replace = FALSE)
smolroundtea <- data.frame(lib,lib2,lib3) #合併三筆資料成為data frame

hist(smolroundtea$lib, #指定繪圖對象
     main = "Small Round Tea", #圖表名稱
     axes = TRUE, 
     freq = FALSE, #freq若為FALSE,則y軸為密度(density)
     plot = TRUE,  #顯示圖表
     label = TRUE) #標示資料
rug(jitter(smolroundtea$lib))  #繪製x軸的頻率圖,對應區間內數值出現頻率
lines(density(smolroundtea$lib), col = "red", lwd = 2) #繪製核密度曲線

hist(smolroundtea$lib,
     main = "Small Round Tea",
     axes = TRUE,
     freq = TRUE, #freq為TRUE,y軸為頻率(frequency)
     plot = TRUE, 
     label = TRUE)
rug(jitter(smolroundtea$lib))

輸出圖表如下:
https://ithelp.ithome.com.tw/upload/images/20191005/201208879GxypQiL2h.png
我在x軸上面還另外加了頻率圖,這樣可以判讀有多少資料出現在同一個x軸區間中

5. 分位圖(quantile-quantile plot, QQ plot)

分位圖在統計學上是用來檢驗數據是否來自同一常態分佈來源的一個方法,R語言的qq圖函數總共有三種:qqnorm, qqplotqqline

qqnorm的寫法為qqnorm(資料, 其他引數),以上面的smolroundtea為例,繪圖程式碼及結果如下:

par(mfrow = c(2,2)) 
qqnorm(smolroundtea$lib,
       datax = FALSE)
qqnorm(smolroundtea$lib2,
       datax = FALSE)
qqnorm(smolroundtea$lib3,
       datax = FALSE) 

https://ithelp.ithome.com.tw/upload/images/20191005/20120887RlB6qtma0V.png
可以看到,R匯出的預設圖表中,x軸代表理論分位數,y軸代表資料數值,如果要讓兩者反過來的話,把datax設為FALSE 即可。

qqline函數則是會把虛擬常態直線標示出來,qqline函數寫法為:qqline(資料, 其他引數),詳細繪圖程式及繪圖結果如下:

par(mfrow = c(3,1), mar = c(4,4,2,2)) 

qqnorm(smolroundtea$lib) 
qqline(smolroundtea$lib,#指定資料
       qtype = 7) #指定分位計算方式,不連續資料填1-3,連續資料填4-9,每個數字有不同計算方式,請參考documentation

qqnorm(smolroundtea$lib2)
qqline(smolroundtea$lib2, qtype = 7)

qqnorm(smolroundtea$lib3)
qqline(smolroundtea$lib3, qtype = 7)

https://ithelp.ithome.com.tw/upload/images/20191005/20120887FB06Whpp4y.png
值得注意的是,qqline必須與qqnorm搭配才會畫出上面的圖。qqline似乎無法單獨運作

最後登場的是qqplotqqplot大致上與qqnorm差不多,但是qqplot是用來檢驗兩組資料是否來自同一常態分佈母體,或擁有近似的常態分佈母體。qqplot函數的寫法為:qqplot(資料1, 資料2, 其他引數)

以上面的smolroundte為例,三組資料smolroundtea$lib vs. smolroundtea$lib2, smolroundtea$lib vs. smolroundtea$lib3smolroundtea$lib2 vs. smolroundtea$lib3 的程式碼以及繪圖結果如下列:

qqplot(smolroundtea$lib, smolroundtea$lib2)
qqplot(smolroundtea$lib2, smolroundtea$lib3)
qqplot(smolroundtea$lib, smolroundtea$lib3)

https://ithelp.ithome.com.tw/upload/images/20191005/20120887400JnUsY2r.png
{補充說明:如果要再更詳細檢查兩個資料的相關性,可以使用cor()函數或者是cor.test()函數進行檢查}

6. 等高線圖 (Contour plot)

等高線圖通常用來繪出一個區域的地理高度變化,用來繪製多變量微積分的圖也可以。在網路上搜尋一陣子後,我突然看到R官方documentation的等高線圖例題是畫類似多變量微積分的圖,所以我就拿了官方的例題,然後修改成(sin(x) * sin(y)) / (x * y)的公式。以下是程式碼及輸出結果:(等高線圖這個部分除了contour函數可以繪製以外,還可以做其他類似等高線圖的圖,例如:persp函數(繪製透視圖)及image(繪製格網圖),以下程式碼也包含perspimage繪圖)

mulvar1 <- seq(-10, 10, length = 50)
mulvar2 <- seq(-10, 10, length = 50)
mulvar <- function(x, y) {  #先給公式一個函數
  (sin(x) * sin(y)) / (x * y) 
  }
z <- outer(mulvar1, mulvar2, mulvar) #用outer給mulvar1及mulvar2 統一套用mulvar函數
par(mfrow = c(2,2))
contour(mulvar1, mulvar2,z) #繪製等高線圖(左上)
persp(mulvar1, mulvar2,z,  #繪製透視圖(右上)
      theta = 60, phi = 25,  #theta指定方位角、phi指定餘緯
      expand = 0.5, 
      col = rainbow(10)) 
image(mulvar1, mulvar2,z,  #繪製格網圖(左下)
      col = hcl.colors(12, "YlOrRd", rev = TRUE),
      xlab = "mulvar1",
      ylab = "mulvar2")

https://ithelp.ithome.com.tw/upload/images/20191005/20120887ru6QvLG0AX.png

參考資料:

  1. http://www.stat.nuk.edu.tw/cbme/math/statistic/sta2/s4_6/bud.html
  2. http://web.ntpu.edu.tw/~cflin/Teach/R/R06EN06Graphics.pdf

上一篇
Day 18- R語言 基礎繪圖函數整理 Part 1
下一篇
Day 20- R語言 流程控制-if, ifelse, switch
系列文
新手 R 語言學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言