2020年9月4日 星期五

7_geom_bar()函式的秘密

 在經過BMW車型油秏會議後,我小小碼農得罪了行銷部的姐姐,所以行銷部丟了一份分析任務,看完很簡單使用geom_bar()長條圖函式即可完成行銷部所交代的分析任務,但天不從人願問題總是會發生,但在前幾天在鐵達尼的資料集用geom_bar長條圖玩的不亦樂乎,就很簡單啊.....問題出在哪邊....

我們採用diamond R內鍵資料集,該資料集主要是描述鑽石大小以集切割得好不好

ggplot(data = diamonds) + 

  geom_bar(mapping = aes(x = cut))

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

demo <- tribble(

  ~cut,         ~freq,

  "Fair",       1610,

  "Good",       4906,

  "Very Good",  12082,

  "Premium",    13791,

  "Ideal",      21551

)

tribble允許你在R建立一個二維表格名稱為demo如上圖,並重新定義鑽石切割類別的數量,並進行統計

ggplot(data = demo) +

  geom_bar(mapping = aes(x = cut))

這是發生甚麼事!數量變成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")

喔...耶...照著所定義的數量出現,記得,曾經為了這個問題困擾了我一個禮拜,我知道...我菜!我知道...我苯!曾經萬念俱灰想放棄R,我竟然一個geom_bar長條圖搞得死去活來,是有多挫折

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

ggplot(data = diamonds) + 

  geom_bar(mapping = aes(x = cut, colour = cut))

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

ggplot(data = diamonds) + 

  geom_bar(mapping = aes(x = cut, fill = cut))

是的!使用fill就將面積完全填滿,這就是fill和color兩者的不同及使用時機。

而在上圖看到fill和X軸的變數都是cut,若是像前面的範例將fill指定給其他變數會發生甚麼事?會產生堆疊

ggplot(data = diamonds) + 

  geom_bar(mapping = aes(x = cut, fill = clarity))

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

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

  geom_bar(alpha = 1/5, position = "identity")

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

  geom_bar(fill = NA, position = "identity")

ggplot(data = diamonds) + 

  geom_bar(mapping = aes(x = cut, fill = clarity), position = "fill")

ggplot(data = diamonds) + 

  geom_bar(mapping = aes(x = cut, fill = clarity), position = "dodge")

在這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)

執行完後R會將繪圖的結果存到bar的變數中,此時我就可以操作變數如下

bar + coord_flip()

bar + coord_polar()

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

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

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

ggplot繪圖到這邊就告一段落



沒有留言:

張貼留言

無現金支付的反思!

  **購物經歷** - 作者花費大量時間尋找立燈,最終在IKEA購買了一個649元的立燈 - 在IKEA附近停車場遇到只接受無現金支付的情況,被迫註冊並使用Line Pay **無現金支付的觀察** - 作者認為Line Pay作為前端介面,有助於提高停車場付費效率 - 作者預...