全棧 – 13 ggplot2 在 R 中進行視覺化

張巨集倫發表於2019-03-02

這是全棧資料工程師養成攻略系列教程的第十三期:13 ggplot2 在R中進行視覺化。

我們已經具備了一定的程式碼基礎,現在不妨來了解下資料視覺化,從生動的圖形中更好地感受資料之美。R是一門統計分析語言,和Python一樣,語法簡單並且有非常豐富的功能包,其中的ggplot2包便可以用簡潔的語法繪製出美觀多樣的圖形。

下載和安裝

如果沒有R的話需要去下載並安裝,在R的官網中找到下載連結,選擇最近的映象地址下載即可,www.r-project.org/。安裝完畢後即可執行R,軟體如下圖所示,介面比較簡單,提供的使用者圖形化介面十分有限。

全棧 – 13 ggplot2 在 R 中進行視覺化

因此可以再安裝一個叫作RStudio的軟體,它基於R的核心提供了更佳豐富的使用者圖形化操作介面,使用起來更方便,使用者體驗更好。可以在RStudio的官網找到下載連結,下載並安裝RStudio,www.rstudio.com/。安裝完畢後執行RStudio,軟體介面如下圖所示。

全棧 – 13 ggplot2 在 R 中進行視覺化

左上角的兩個按鈕分別用於新建各種檔案和開啟已有檔案,左邊是一個互動命令列,可以互動式地執行程式碼。右邊上半部分是環境視窗(Environment)和歷史視窗(History),分別可以檢視當前程式設計環境中已有的變數,以及檢視歷史命令記錄。右邊下半部分包括檔案(Files)、繪圖(Plots)、包(Packages)、幫助(Help)等標籤頁,分別用於檢視檔案目錄、檢視繪圖結果、檢視引用的包、檢視幫助文件。

例如,在左邊的互動命令列中輸入?plot並回車,即可在右邊的Help中檢視plot函式的使用文件。再輸入a <- 1並回車,即可在右邊的Environment中看到已有的變數,同時在History中也可以看到之前執行的兩條命令記錄。

R基礎

安裝包和載入包

R和Python一樣,功能之所以強大是因為它具備豐富多樣的功能包。在R中使用以下命令即可安裝一個新的包,例如ggplot2,包的名字需要用引號括起來。

install.packages("ggplot2")複製程式碼

功能包安裝完畢之後,即可載入並使用其提供的資料集、函式和功能,使用以下命令載入一個功能包,包的名字不需要用引號括起來。

library(ggplot2)複製程式碼

資料結構

R中的資料結構主要有向量、矩陣、陣列、資料框、因子和列表。

向量是用於儲存數值型、字元型或邏輯型資料的一維陣列,單個向量中的資料必須擁有相同的型別或模式,即要麼都是數值型,要麼都是字元型,要麼都是邏輯型。可以發現,R中的賦值使用箭頭符號<-,而不是其他語言常用的=

# 數值型
a <- c(1, 2, 5, 3, 6, -2, 4)
# 字元型
b <- c("one", "two", "three")
# 邏輯型
c <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)複製程式碼

用方括號可以訪問向量中的元素,例如訪問向量a中的第二個和第四個元素,可以用a[c(2, 4)]。向量也支援支援冒號語法,a[2:6]將返回a的第二至第六個元素。所以向量的用法和Python中list有相似又不同,Python中list的下標從0開始,而且冒號語法只包括開始下標但不包括結束下標。另外Python中負號下標表示從後往前數,而向量中負號表示排除,例如a[-1]返回向量a中除了第一個以外的其他全部元素。

矩陣是一個二維陣列,每個元素都擁有相同的型別,必須都為數值型、字元型或邏輯型,可通過函式matrix建立矩陣。

mymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_columns, byrow=FALSE, dimnames=list(rownames, colnames))複製程式碼

其中vector向量包含了全部矩陣元素,nrow和ncol為行數和列數,byrow預設為FALSE表示按列填充,否則TRUE為按行填充,dimnames為行名和列名。使用時,只有前三個引數是必須的。

y <- matrix(1:20, nrow=5, ncol=4)
cell <- c(1, 26, 24, 68)
rnames <- c("R1", "R2")
cnames <- c("C1", "C2")
mymatrix <- matrix(cell, nrow=2, ncol=2, byrow=TRUE, dimnames=list(rnames, cnames))
mymatrix <- matrix(cell, nrow=2, ncol=2, byrow=FALSE, dimnames=list(rnames, cnames))複製程式碼

x[i,]表示矩陣x中的第i行,x[,j]表示矩陣x中的第j列,x[i, j]表示矩陣x中的第i行第j個元素,或者使用數值型向量代替i、j以同時選擇多行或多列。

陣列和矩陣類似,但是維度可以大於2,通過array函式建立。

myarray <- array(vector, dimensions, dimnames)複製程式碼

其中vector包含陣列中的資料,dimensions是一個數值型向量,給出了各個維度下標的最大值,dimnames可選,以向量形式指定各個維度的名稱。

dim1 <- c("A1", "A2")
dim2 <- c("B1", "B2", "B3")
dim3 <- c("C1", "C2", "C3", "C4")
z <- array(1:24, c(2, 3, 4), dimnames=list(dim1, dim2, dim3))複製程式碼

資料框可以理解成資料庫中的表,即每一行表示一條記錄,每一列表示一項欄位。不同列可以包含不同型別,例如某一列為數值型而另一列為字元型,但每列所有行的資料型別必須相同。資料框通過data.frame建立,是R中最為重要的一種資料結構。

patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(patientID, age, diabetes, status)複製程式碼

訪問資料框中的資料可以通過以下三種方式:

# 訪問第一列和第二列
patientdata[1:2]
# 按列名訪問,使用方括號和向量
patientdata[c("diabetes","status")]
# 按列名訪問,使用$
patientdata$age複製程式碼

無序類別型變數和有序類別型變數在R中都稱為因子。簡單來說,因子就是一種離散值,例如性別只能是male和female,對應兩個字元型因子,或者分別用0和1來表示,對應兩個數值型因子。如果因子的不同水平之間存在排序關係,則稱為有序因子。以下程式碼中,diabetes對於不同的人只能取Type1或Type2,因此是一個因子。

diabetes <- factor(c("Type1", "Type2", "Type1", "Type1"))複製程式碼

以下程式碼中,status對於不同的人只能取Poor、Improved或Excellent
,同時三者之間存在排序關係,因此使用orderded=TRUE指定為一個有序因子。

status <- factor(c("Poor", "Improved", "Excellent", "Poor"), ordered=TRUE)
# 或者手動指定排序的順序
status <- factor(c("Poor", "Improved", "Excellent", "Poor"), ordered=TRUE, levels=c("Poor", "Improved", "Excellent"))複製程式碼

列表和向量一樣,同樣是多個元素的排列,但每個元素可以是以上提及的任何資料結構,甚至是其他列表的組合,即巢狀列表。使用list定義一個列表,並可以為各個元素進行命名。

g <- "My First List"
h <- c(25, 26, 18, 39)
j <- matrix(1:10, nrow=5)
k <- c("one", "two", "three")
mylist <- list(title=g, ages=h, j, k)
mylist複製程式碼

可以看到mylist包括四個元素,使用mylist[[2]]mylist$age或者mylist[["ages"]]訪問其中的第二個元素。

最後需要注意的是,R中的變數名、行名、列名等名稱,都儘量使用純英文,避免使用中文導致錯誤。

資料集

R中提供了很多資料集,安裝包也會提供一些額外的資料集,這些資料集大多以資料框的形式給出,例如mtcars資料集提供了32款車型的11項引數值,所有引數值都為數值型。

head(mtcars)
nrow(mtcars)
names(mtcars)
summary(mtcars)複製程式碼

另外,也可以從csv、txt等檔案中讀取資料為資料框,使用data.table包的fread()函式讀取資料,例如之前提供的douban_movie_clean.txt。讀取之前需要在Files標籤頁中找到資料檔案,然後點選齒輪中的Set As Working Directory,將當前目錄設為工作路徑。

全棧 – 13 ggplot2 在 R 中進行視覺化

# 沒有包則安裝
# install.packages("data.table")
library(data.table)
douban_movie_clean <- fread("douban_movie_clean.txt", header=TRUE, sep="^", encoding="UTF-8")複製程式碼

R指令碼

除了在互動命令列中編寫R程式碼,一種更方便的選擇是使用R指令碼,就如同新建一個.py程式碼,在Sublime中編輯完畢後再執行一樣。點選左上角的新建檔案按鈕,選擇R Script,在新建的R指令碼中可以自由地編寫多行程式碼。編寫完畢後,選中全部或者部分程式碼,點選R指令碼右上方的Run按鈕,即可執行選中的程式碼。

全棧 – 13 ggplot2 在 R 中進行視覺化

ggplot2

ggplot2是R中的一個功能包,可以用簡潔統一的語法繪製出美觀多樣的圖形。安裝好ggplot2之後,讓我們通過一個簡單的例子感受下ggplot2的魅力。

# 如果沒有則安裝
# install.packages("ggplot2")
# 載入包
library(ggplot2)
ggplot(douban_movie_clean) + geom_histogram(aes(x=length))複製程式碼

以上程式碼對豆瓣電影資料集的片長這一欄位繪製直方圖,橫軸為電影片長,縱軸為每個片長區間的電影數量。繪圖結果將顯示在Plots標籤頁中,可以點選Zoom按鈕放大影像,可以發現大多數電影的片長集中在90至120分鐘之間。

R學習筆記

如果對R感興趣、希望進一步瞭解更多內容,可以訪問我的部落格,zhanghonglun.cn/blog/tag/r/,以上鍊接以r為標籤搜尋相關文章,搜尋結果中會有一個《R學習筆記》系列,共14篇文章,可作為進一步學習R的參考資料。

視訊連結:在R中進行視覺化

如果覺得文章不錯,不妨點一下左下方的喜歡~

相關文章