跟著小郭郭學R:12-ggplot2(3)qplot(1)

等到下次回台北就又發薪了呢
這次要點怎樣的東西來吃呢?

OK,這次要教的是ggplot 套件中比較基礎的qplot()函數,
我們會從最基本的單維圖表,也就是長條圖與直方圖開始教起。

首先先來看看qplot()的結構:

qplot(x, y = NULL, …, data, facets = NULL, margins = FALSE,
geom = “auto", xlim = c(NA, NA), ylim = c(NA, NA), log = “",
main = NULL, xlab = deparse(substitute(x)),
ylab = deparse(substitute(y)), asp = NA, stat = NULL, position = NULL)

希望這不會嚇到各位,因為這真的是最簡單的了XDDDDDD
我會盡量讓各位理解的。

首先是x跟y,x跟y是要被餵入圖表的資料,因為有些資料圖表,像這次介紹的長條圖與直方圖就只需要x值,所以y值的預設是空值,不過像上次的體驗裡的散佈圖就有用到y值。

data是要告訴R這些x跟y應該要去哪裡提取,主要就是填入dataset的名稱

facets 跟margins 同樣屬於分面功能,facets決定的是要以哪些變數作為分面的依據,在預設值為空值的狀況下,是不會有分面的,margin則是會以現有的分面為依據再依變數類別加入新的分面層級。
這兩個功能我們在這裡還不會用到XDDDDD,因為本人還沒學好XDDDDD。

geom決定這些資料將會被怎樣的繪製,如果是單維資料的話預設的圖表會是長條圖,
二維資料的話則是散佈圖。

xlim跟ylim分別決定x值與y值的上下限,如果要特別檢視圖表的某個部分時就會用到。

log是將這些數值進行對數轉換,可以藉由填入”x”,”y”,”xy”來對想要進行轉換的變數進行轉換。

main是圖表的標題,xlab與ylab則是變數的名稱,預設值是變數名稱。

asp是長寬比。

stat與position是變數的統計轉換及位置調整,不過在qplot中是沒辦法使用這兩個功能的。

讓我們開始吧,這次的資料集是芝加哥市政府所提供的性犯罪者相關檔案,點選右上角的Download並且選擇CSV就可以下載了。

https://data.cityofchicago.org/Public-Safety/Sex-Offenders/vc9r-bqvy

而這是我們今天要講的所有指令,我想前面一段都是之前教過的了
我們會分層來講要怎麼借由函數的堆疊來畫出想要的圖。

A003

在下載好之後的行動就跟之前在調查闖紅燈一樣了:設定工作位置、把檔案移進去、載入資料集並指派名稱。這次不一樣的是我們還要叫出ggplot2套件。

而在載入資料集之後,我希望各位能養成兩個習慣:

  1. 先用str()、summary()跟head()大致掃過一次,
  2. 檢查有無NA值

這兩個動作基本上是在對任何的資料集都要做的兩個基本工作,可以省掉很多不必要的麻煩。

A005

像在這次的資料集中,我們就可以看到兩個接下來要先經過處理才能進行分析的部分:

身高與體重,這兩個變數以我們的角度是怎麼看怎麼怪的,但對美國人而言可能非常直覺。

身高的60應該就是六呎0吋,體重的607指的是607英磅,在接下來如果要分析這兩個變數的話就會處理,不過我們這次要分析的主要會是年齡、性別以及種族分類,所以就留到下次再說XD

 

我們先從性別開始吧,最原始的圖表長這樣:

P01<-qplot(GENDER,data=D01)

P01

這段指令是先將製圖結果指派為P01,再叫出P01,結果如下:

A006

壓倒性的差距呢。
真是有夠簡單,但好像有點太簡單了。

如果是我的話我會希望他可以有顏色、有數字標籤,那怎麼做呢?

首先是加上顏色的部分,我會再加上 +geom_bar(aes(fill = GENDER))

P01<-qplot(GENDER,data=D01) +geom_bar(aes(fill = GENDER))

P01

就是告訴R我們要再加上一層圖,這層圖會是長條圖,在aes的設定項中,填滿會由性別這個變數決定,結果如下:

A007

因為單個長條裡只會有ㄧ個性別,所以整個長條都會是一樣的顏色。
但如果改選用其他類別變數,如種族來進行填滿的話,就會有不一樣的顏色出現:

P01<-qplot(GENDER,data=D01) +geom_bar(aes(fill=RACE))

P01

A008

但我不是很喜歡這結果:
一張圖表裡擠了6*2=12個資訊真的是有些太複雜了,所以用原本的就好。

接下來我想要叫出資料標籤,也就是男女的人數,這時我需要再疊上一層圖:

+geom_text(stat="count",aes(label=..count..),vjust=-1)

這告訴R的資訊是:我要加上一層有關文字的圖層,使用的統計轉換是計數
在aes選項中,我要調整標籤的文字,要沿用前面的計數結果,然後我要調整標籤的垂直位置

(vjust的值可以在1到-1之間),而這就是結果。

P01<-qplot(GENDER,data=D01) +geom_bar(aes(fill =GENDER)) +geom_text(stat="count",aes(label=..count..),vjust=-1)

P01

A009

 

接下來來做種族上的分析,一開始的圖長這樣:

P02<-qplot(RACE,data=D01)

P02

A010

黑人的比例驚人的高耶@@

在比較三個以上的項目的時候,我們就多了一個新的課題:排序
在這裡我使用了reorder()函數,這個函數的結構是這樣的:

reorder( x, X , FUN)

x是用於排列的依據,通常會選用類別變數,這個變數中的每一個獨特值將會被用來做排列的依據。

X則是會依x經過FUN計算的結果而被歸類的變數,必須跟x同樣的長度而且要含有x中的所有level。

FUN是指x在用於排序之前所需經過的計算,這裡我使用的是計數 length(x)。
之後我們會教這個吧,我猜XDDDDD

然後我們把這串計算結果指派進原有的資料集:

D01$RACE<-reorder(D01$RACE,D01$RACE,FUN =function(x) -length(x))

之後再叫一次圖,就會有以下的結果:

P02<-qplot(RACE,data=D01)

P02

A011

如果要升冪的話,就把-length(x)中的-去掉:

A012

OK,接下來跟第一張圖一樣上色上標籤,不過這次我想幫標籤改個顏色,這需要在aes中再加上一個color

P02<-qplot(RACE,data=D01)+geom_bar(aes(fill=RACE))+
geom_text(stat="count",aes(label=..count..,color=I(“grey"),vjust=-1))

P02

A014

值得注意的是在寫顏色相關的引數,包含fill以及color時,要記得在顏色之外再加一個I(),
不然會變成這樣:

P02<-qplot(RACE,data=D01)+geom_bar(aes(fill=RACE))+
geom_text(stat="count",aes(label=..count..,color="grey",vjust=-1))

P02

A013

顏色的字元會被當成圖例的一部分,作為對顏色的描述,而且根本不是灰色啊XDDDDD

 

大概這樣就完成了。接下來進入第三張:年齡

年齡有別於前面兩個變數,前面兩個是類別變數所以使用長條圖(Bar Chart),而年齡則是連續變數,所以會使用的是直方圖(Histogram)。
兩者之間的差別在於長條圖則可以自由調整各個長條的次序,而且中間會有空隙,但直方圖必然是照x值的順序作升冪或降冪排列,而且直方之間不會有空隙。

一開始最原始的圖形是這樣的:

P03<-qplot(AGE,data=D01)

P03

A015

OK,一坨不知其然的屎。

我們要做幾項調整,首先是區間。

直方圖的直方是透過將原始的連續變數曲線切割作數個區間而來的,所以我們要先設定切割的大小,先以5來試試看吧。

P03<-qplot(AGE,data=D01,binwidth=5)

P03

A016

好,看來這不是關鍵性的問題,換上一點顏色跟外框看看好了,順便再加個標題、x值名稱與y值名稱

P03<-qplot(AGE,data=D01,binwidth=5,color=I(“White"),fill=I(“steelblue"),xlab = “Age",ylab = “Count",main="Count by Age")

P03

A017

看起來好一點了,看來是底下的座標軸問題,刻度只有25太稀疏了

這時就需要加上對x軸刻度的指定,這串則是使用scale_x_continous達成,當中的刻度就是breaks,而我們指派給他的刻度是從10開始,到100結束,間格為5的等差數列,也就是seq(10,100,5)

 

P03<-qplot(AGE,data=D01,binwidth=5,color=I(“White"),fill=I(“steelblue"),xlab = “Age",ylab = “Count",main="Count byAge")+scale_x_continuous(breaks=seq(10,100,5))

P03

A019

這好多了,只是上面的標題不置中讓我有點在意。

這時會需要使用theme函數來調整,當中的hjust可以設定0~1之間的值
0是靠左,1則是靠右,0.5則是置中。

P03<-qplot(AGE,data=D01,binwidth=5,color=I(“White"),fill=I(“steelblue"),xlab = “Age",ylab="Count",main="CountbyAge")+scale_x_continuous(breaks=seq(10,100,5)) +theme(plot.title = element_text(hjust = 0.5))

A018

OK,這下三張圖都做好了,就差把它們保存起來

保存就請按下Plots裡面的Export,就有選項可以按:

A020

還有另外一個做法是ggsave,只是那個實在太煩人了我還沒搞定所以之後再教XDDDDDD
今天就先這樣吧,我們下次見~~~

這場雨到底要下多久RRRRRRR

發表留言