第三篇:資料視覺化 - ggplot2

穆晨發表於2017-05-20

前言

        R語言的強大之處在於統計作圖。其中統計部分的內容很多很強大,因此會在以後的例項中逐步介紹;而作圖部分的套路相對來說是比較固定的,現在可以先對它做一個總體的認識。

       在上一篇文章中,介紹了使用graphics庫進行繪圖的方法,而本文將引入一個更為強大的庫 --- ggplot2,它能做出各式各樣,非常酷炫的統計圖(甚至地圖,熱圖等)。

       本文將結合一個實際專案中的例子講解如何使用ggplot2繪圖。

ggplot繪圖總體步驟

1. 呼叫ggplot函式設定圖形基本資訊 --- 如:使用的資料集,x軸y軸向量,分類向量等最為基礎的特徵。

2. 呼叫各種繪圖函式繪製各類圖形 -- 如:條形圖(geom_bar),直方圖(geom_histogram),散點圖(geom_point)等。

3. 呼叫各種標度函式對圖形進行調整 --- 如:調整座標軸(scale_x_continuous),調整色彩(scale_colour系列),調整圖例(scale_fill系列)等。

4. 呼叫annotate函式往圖形中新增註解。

5. 呼叫theme函式以對圖形進行最終美化。一般來說這個函式是僅僅對外觀因素進行美化,和具體資料不打交道。

       特別強調的是第五點theme函式特別強大,能定製出非常酷炫的效果。

一個雙柱狀圖+折線圖的繪製例項

       本例需要生成的是一個使用者在過去一段時間內,觀看韓劇以及非韓劇節目的時間隨時間變化的雙柱狀圖,同時,要在這個圖形上用折線圖繪製所有使用者觀看韓劇/非韓劇的平均時間。

       第一步:獲取基礎資料集(僅顯示部分)

       

       該資料集中,每行代表該使用者的一次觀看記錄。

       各欄位說明:

- DEVICE_ID:使用者標識
- WATCH_TIME:觀看時間
- WATCH_DURATION:觀看時長
- ISKD:該節目是否為韓劇
- PERTIME:所有使用者的平均觀看時長

第二步:資料清洗

       在剛從文字中獲取到資料後,資料型別有可能不是你所期望的。

       比如我的這個例子中,獲取到的WATCH_TIME是因子型別,這顯然不合我意。於是我將它轉換成了時間型別。另外ISKD因為待會要拿他作為兩個柱狀的區分條件,因此將它轉換為因子型別。至於觀看時間,由於精度要求不高,因此直接轉換為整型。

       另外,第一列的資料沒用到(使用者的裝置ID),因此剔除掉。

       

       清洗完畢後的資料集如下:

       

       第三步:構建圖形基礎函式變數
       

       這一步生成的graph_base變數表示,使用data資料集,橫軸為觀看時間,縱軸為觀看時長,根據該劇目是否為韓劇進行分類,且縱軸最大值為觀看時間的最大值。

       這些基礎資訊都可以儲存在這樣的一個變數裡,隨掉隨用。

       第四步:繪製韓劇/非韓劇觀看時長雙柱狀圖

       

       繪製函式中的引數與該圖形顯示有關,其中stat表示取觀看時長的具體值,position表示雙柱狀是左右並列顯示。

       注意是在上一步的基礎圖形資訊變數上加上繪製函式,這就彷彿在基礎圖層之上新增了一個圖層。

       第五步:繪製平均觀看時長折線圖

       

       另外兩行程式碼則進行描點,顯示具體值的操作。

       注意同樣是在上一步生成的變數之上疊加圖層。

       第六步:對座標軸進行調整

       

       這段程式碼將橫座標軸進行了格式化(具體引數請查閱相關手冊)以及一定的美化。

       所謂的座標軸,或者下面要修改的圖例都可以統稱為標度。ggplot各種各樣的標度函式,其形式大約都是scale_xx_xx這樣。

       第七步:設定標題,圖例等資訊

       

       這一步對圖中的圖例以及影象的標題進行了較為細緻的調整,使得影象看起來更加美觀。

       另外繪製柱狀圖圖例的時候也順便為柱狀圖設定了主題色Pastel1。

       第八步:儲存繪製結果:

       還可以儲存為pdf格式之類的,非常方便。

結果展示

       

 

小結

       本文僅僅是從一個例項出發,講解ggplot2繪圖的基本框架步驟。對於其他細節,請讀者在具體使用到的時候再去專門查詢,沒必要一次學會。

       最後推薦一本書《R資料視覺化手冊》。 

相關文章