在經過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繪圖到這邊就告一段落
沒有留言:
張貼留言