前言
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數據可視化手冊》。