iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 7
0
自我挑戰組

使用R進行探索式資料分析之初探系列 第 7

geom_bar()函式的秘密

  • 分享至 

  • xImage
  •  

鐵達尼的資料集用geom_bar長條圖,本次資料集採用diamond R內鍵資料集,該資料集主要是描述鑽石大小以及切割的類別,首先看一下鑽石切割的統計數量

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut))

https://ithelp.ithome.com.tw/upload/images/20200907/201207567mVNxh4SMl.png
x軸為鑽石切割等級,y軸為數量,但我們可以看語法並沒有指定y軸,那他的數量從何而來,我們在前一篇分析車輛每個分析都有指定Y軸的變數,為什麼geom_bar()長條圖就不需要,好像也不是很重要少打幾個字不是很好嗎?鐵達尼存活率分析也不用的很開心嗎?但是,當遇到下列狀況

demo <- tribble(
  ~cut,         ~freq,
  "Fair",       1610,
  "Good",       4906,
  "Very Good",  12082,
  "Premium",    13791,
  "Ideal",      21551
)

https://ithelp.ithome.com.tw/upload/images/20200907/20120756RZIrSNJuml.png
tribble允許你在R建立一個二維表格名稱為demo如上圖,並重新定義鑽石切割類別的數量,並進行統計

ggplot(data = demo) +
  geom_bar(mapping = aes(x = cut))

https://ithelp.ithome.com.tw/upload/images/20200907/20120756gqgjvsQ0xJ.png
數量變成0-1的區間!啊...應該沒指定Y,指定一下

ggplot(data = demo) +
  geom_bar(mapping = aes(x = cut,y = freq)

此時出現一片空白沒有任何圖形怎麼會這樣,難道geom_bar()函式不能有自行的數量嗎?此時開始思考...對啊!不論在鐵達尼的資料集和鑽石的資料集,X軸的變數都是資料集內的,而Y軸的Count的計數的確不是資料集內,那Y軸的Count的資料從哪來的。

查過相關資料原來這是統計轉換,也就是計算圖形新值的算法稱為stat,這適用於長條圖和直方圖,所以我們輸入?geom_bar()出現說明,所以內定值就是計算Count(計數),所以當需依資料欄位的數字進行統計時,必須以下程式碼改變stat

ggplot(data = demo) +
  geom_bar(mapping = aes(x = cut, y = freq), stat = "identity")

https://ithelp.ithome.com.tw/upload/images/20200907/20120756hkSVF6JnDr.png
照著所定義的數量出現,記得,曾經為了這個問題困擾了我一個禮拜,我知道...我菜!我知道...我苯!曾經萬念俱灰想放棄R,我竟然一個geom_bar長條圖搞得死去活來,是有多挫折...

另外,在繪圖時會指定某個變數以顏色來區分,以增加圖形的閱讀性,所以會用colorfill參數進行上色,若是前面幾篇範例有執行過應該不陌生,為什麼需要兩個上色的參數ㄋ?其實只要是使用的繪圖幾何是面狀要上色就使用fill,所以我們看程式碼


ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, colour = cut))

https://ithelp.ithome.com.tw/upload/images/20200907/20120756BAE6zb0fho.png

所以我們可以看到,當你的繪圖幾合是面狀的,而你參數是使用color他只會在外框上色如上圖,若向點和線的使用color沒問題;在程式中顏色的參數是colour而不是color兩者是否效果不同,其實效果一樣沒有不同,嗯.....我知道您的疑惑....我當初為了這兩個名詞又花了一星期,我知道...我菜 我知道...我苯!colour是歐洲人喜歡描述顏色的詞彙,而我們東方都喜歡color,看完解釋我嘔出20兩血....

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = cut))

https://ithelp.ithome.com.tw/upload/images/20200907/20120756LeBvnDoaQ9.png

是的!使用fill就將面積完全填滿,這就是fill和color兩者的不同及使用時機。而在上圖看到fill和X軸的變數都是cut,若是像前面的範例將fill指定給其他變數會發生甚麼事?會產生堆疊

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity))

https://ithelp.ithome.com.tw/upload/images/20200907/20120756r9mYrt0tuX.png

我將fill指定鑽石的克拉,而這鑽石的克拉的專有名詞我不知道也沒買過,所以透過geom_bar()函式的position自動調整,而position有三個參數分別為identity","dodge"或"fill",我們來看效果

ggplot(data = diamonds, mapping = aes(x = cut, fill = clarity)) + 
  geom_bar(alpha = 1/5, position = "identity")

https://ithelp.ithome.com.tw/upload/images/20200907/20120756JQGsUjynv9.png

ggplot(data = diamonds, mapping = aes(x = cut, colour = clarity)) + 
  geom_bar(fill = NA, position = "identity")

https://ithelp.ithome.com.tw/upload/images/20200907/20120756Cvthrbu8f5.png

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity), position = "fill")

https://ithelp.ithome.com.tw/upload/images/20200907/20120756yWyZPB9gj8.png

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity), position = "dodge")

https://ithelp.ithome.com.tw/upload/images/20200907/20120756qVlVrGFYBN.png

在這position 參數中我最常用的是dodge,當然分析中狀況不一多了解不是甚麼壞事?書到用時方恨少;另外一種也是我常用的座標轉換,當X軸的類別太多時我會將圖形轉90度。

首先我會將繪圖的程式是碼存到一個變數中,在前面的範例都是直接使用ggplot函式繪圖,而此時將值前所前的繪圖過程存入一個變數中,如下

bar <- ggplot(data = diamonds) + 
  geom_bar(
    mapping = aes(x = cut, fill = cut), 
    show.legend = FALSE,
    width = 1
  ) + 
 theme(aspect.ratio = 1) +
 labs(x = NULL, y = NULL)
 
 bar + coord_flip()
 bar + coord_polar()

執行bar + coord_flip()
https://ithelp.ithome.com.tw/upload/images/20200907/20120756ECRM2QLsSY.png

執行bar + coord_polar()
https://ithelp.ithome.com.tw/upload/images/20200907/20120756kjlFhwFgDT.png

為什麼今天會寫geom_bar()函式,就像上面講的當初就是Y軸一直出現計數,而變數中的值無法出現,查閱很多文章發現建立ggplot2套件作者的文章,他說長條圖不論在學術或商業等行為是使用最多的圖形,當然他說這是他主觀的想法,當然可能其他圖形的函式也有很多設定,我不知道。

但無論如何ggplot2到這邊告一段落,若是前面的文章的說明你都有理解的話,對於R的繪圖可以掌握,至少我個人的感覺是如此,不論在實驗室、專案計畫、論文等資料分析,我都不用上網查相關語法,對變數了解後直接上code跑出統計圖,而我的叫獸也沒跟我廢屁直接過關,若是你的分析真的很複雜認為這高估,也沒關係,我相信應該這些會成為你很好的基礎進行做變化。

世界的資料總不會像我前面這幾篇,這麼單純總需要整理及轉換,才會達到我們分析的目的,所以下一階段需要一點邏輯及思考,你準備好了嗎?

ggplot繪圖到這邊就告一段落


上一篇
ggplot2探討車子油耗表現之二
下一篇
資料探索最佳工具_dplyr_filter()
系列文
使用R進行探索式資料分析之初探30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言