1. 程式人生 > >ggplot2繪圖技巧之條形圖

ggplot2繪圖技巧之條形圖

今天和大家分享的是關於ggplot2的快速畫圖入門攻略,會在接下來三章教大家如何繪製工作中最常用的條形圖、直方圖和折線圖,講解ggplot2的基本語法規則、簡單的圖形修飾,以及圖形進階功能—分面,不做深入的研究,簡單易上手、使用就是王道!

一、ggplot2基本語法規則

ggplot(資料集,aes(x=橫座標,y=縱座標,fill=填充顏色,color=邊框顏色))+geom_bar()/geom_histogram()/geom_line()

+geom_xx代表將要繪製什麼樣的圖形

二、繪製條形圖

繪製條形圖之前,有幾個需要注意的地方:

1.geom_bar預設等於geom_bar(stat="bin"),繪製頻數條形圖,橫座標表示類別,縱座標表示對應類別出現的次數;

2.如果要繪製縱座標代表數值的條形圖,應該用geom_bar(stat="identity"),這裡很容易被忽視,一定要當心;

3.geom_bar中除了stat引數,還有個引數position,position="dodge"(簇狀/水平)、"stack"(堆積/垂直)、"fill"(百分比);

為了讓大家更直觀的理解如何繪製條形圖,我選用ggplot2自帶的mtcars資料集進行講解:

> library(ggplot2)
> str(mtcars)
'data.frame':	32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

可以看到,mtcars資料集中的指標均為數值型,為了研究氣缸數cyl與汽車馬力mpg間的關係,同時是否受指標vs的影響,我們先來畫圖看看:

> ggplot(mtcars,aes(x=cyl,y=mpg,fill=vs))+geom_bar(stat="identity",position="dodge")

從上圖可以看到,繪製出來的圖形效果並不理想,原因是指標vs只有0/1兩個值,不適合直接拿來作為填充依據,因為圖例會預設識別為5檔數值型,此時如果將其轉換成因子型,效果則會好很多:

> ggplot(mtcars,aes(x=cyl,y=mpg,fill=factor(vs)))+geom_bar(stat="identity",position="dodge")

當vs轉化為因子型後,繪圖變得清楚,同時因為vs=1時,cyl=8的值缺失,因此vs=0,cyl=8的豎條自動填充過來,雖然資料觀測值較少,但可以看出,隨著氣缸數的增加,汽車馬力會減小。

接下來講一下用顏色去代表正負值,在工作中很常見,這裡選用《R資料視覺化手冊》中的一個例項,加深大家的理解,有興趣可以購買這本書看看,還是很有用的,廢話不多說,上程式碼:

> library(gcookbook)
> str(climate)
'data.frame':	499 obs. of  6 variables:
 $ Source    : chr  "Berkeley" "Berkeley" "Berkeley" "Berkeley" ...
 $ Year      : num  1800 1801 1802 1803 1804 ...
 $ Anomaly1y : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Anomaly5y : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Anomaly10y: num  -0.435 -0.453 -0.46 -0.493 -0.536 -0.541 -0.59 -0.695 -0.763 -0.818 ...
 $ Unc10y    : num  0.505 0.493 0.486 0.489 0.483 0.475 0.468 0.461 0.453 0.451 ...

這裡選用的是climate資料集,可以看到climate有6個變數,其中變數Anomaly0y中包含負值,接下來篩選出符合要求的資料

csub<-subset(climate,Source=="Berkeley"&Year>=1900)#提取資料集中source為Berkeley,且年份超過1900年的資料
csub$pos<-csub$Anomaly10y>=0#定義一個變數pos,代表Anomaly10y>0的資料
ggplot(csub,aes(x=Year,y=Anomaly10y,fill=pos))+geom_bar(stat="identity",position="identity")

這裡利用fill=正值,來實現用不同顏色代表正負值,如果我們想用紅色代表負值,藍色代表正值,如何操作呢?

ggplot(csub,aes(x=Year,y=Anomaly10y,fill=pos))+geom_bar(stat="identity",position="identity",color="white",size=0.25)+scale_fill_manual(values=c("#FFB6C1","#87CEFA"),guide=FALSE)

這裡通過調色盤對填充顏色進行了一個自主編輯,使得繪圖結果較為友好,可以直觀看到負值年份和正值年份的情況。

由於時間關係,條形圖的分享就到這裡,後邊會和大家分享直方圖的繪圖方法以及基礎的配色設定、圖例的設定,敬請期待!有問題歡迎隨時溝通。