R 語言繪製數據:圖表篇
R 語言有非常多的繪圖和數據可視化的包,比如 graphics
、lattice
、ggplot2
等。這是 R 語言系列的第 9 篇文章,我們會介紹 R 中用來繪圖的各種函數。
本文使用的 R 是 4.1.2 版本,運行環境為 Parabola GNU/Linux-libre (x86-64)。
$ R --version
R version 4.1.2 (2021-11-01) -- "Bird Hippie"
Copyright (C) 2021 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
R 是自由軟體,沒有任何擔保責任。只要遵守 GNU 通用公共許可證的版本 2 或者版本 3,你就可以對它進行(修改和)再分發。詳情見 https://www.gnu.org/licenses/。
折線圖
我們以印度全境消費者物價指數(CPI -- 鄉村/城市)數據集為研究對象,它可以從 https://data.gov.in/catalog/all-india-consumer-price-index-ruralurban-0 下載。選擇「截止到 2021 年 11 月」 的版本,用 read.csv
函數讀取下載好的文件,如下所示:
> cpi <- read.csv(file="CPI.csv", sep=",")
> head(cpi)
Sector Year Name Andhra.Pradesh Arunachal.Pradesh Assam Bihar
1 Rural 2011 January 104 NA 104 NA
2 Urban 2011 January 103 NA 103 NA
3 Rural+Urban 2011 January 103 NA 104 NA
4 Rural 2011 February 107 NA 105 NA
5 Urban 2011 February 106 NA 106 NA
6 Rural+Urban 2011 February 105 NA 105 NA
Chattisgarh Delhi Goa Gujarat Haryana Himachal.Pradesh Jharkhand Karnataka
1 105 NA 103 104 104 104 105 104
2 104 NA 103 104 104 103 104 104
3 104 NA 103 104 104 103 105 104
4 107 NA 105 106 106 105 107 106
5 106 NA 105 107 107 105 107 108
6 105 NA 104 105 106 104 106 106
...
以 Punjab 州為例,對每年各月份的 CPI 值求和,然後用 plot
函數畫一張折線圖:
> punjab <- aggregate(x=cpi$Punjab, by=list(cpi$Year), FUN=sum)
> head(punjab)
Group.1 x
1 2011 3881.76
2 2012 4183.30
3 2013 4368.40
4 2014 4455.50
5 2015 4584.30
6 2016 4715.80
> plot(punjab$Group.1, punjab$x, type="l", main="Punjab Consumer Price Index upto November 2021", xlab="Year", ylab="Consumer Price Index")
plot
函數可以傳入如下參數:
參數 | 描述 |
---|---|
x |
向量類型,用於繪製 x 軸的數據 |
y |
向量或列表類型,用於繪製 y 軸的數據 |
type |
設置繪圖類型:p 畫點;l 畫線;o 同時畫點和線,且相互重疊;s 畫階梯線;h 畫鉛垂線 |
xlim |
x 軸範圍 |
ylim |
y 軸範圍 |
main |
標題 |
sub |
副標題 |
xlab |
x 軸標題 |
ylab |
y 軸標題 |
axes |
邏輯型,是否繪製坐標軸 |
結果如圖 1。
自相關圖
自相關圖能在時序分析中展示一個變數是否具有自相關性,可以用 R 中的 acf
函數繪製。acf
函數可以設置三種自相關類型:correlation
、covariance
或 partial
。圖 2 是 Punjab 州 CPI 值的自相關圖,x 表示 CPI。
acf(punjab$x,main='x')
acf
函數可以傳入以下參數:
參數 | 描述 |
---|---|
x |
一個單變數或多變數的時序對象,或者一個數值向量或數值矩陣 |
lag.max |
最大滯後階數 |
type |
字元型,設置所計算的自相關類型:correlation 、covariance 或 partial |
plot |
邏輯性,若 TRUE 則繪製圖像,若 FALSE 則列印傳入數據的描述信息 |
i |
一組要保留的時差滯後 |
j |
一組要保留的名稱或數字 |
柱狀圖
R 中畫柱狀圖的函數是 barplot
。下面的代碼用來畫 Punjab 州 CPI 的柱狀圖,如圖3:
> barplot(punjab$x, main="Punjab Consumer Price Index", sub="Upto November 2021", xlab="Year", ylab="Consumer Price Index", col="navy")
barplot
函數的使用方法非常靈活,可以傳入以下參數:
參數 | 描述 |
---|---|
height |
數值向量或數值矩陣,包含用於繪圖的數據 |
width |
數值向量,用於設置柱寬 |
space |
柱間距 |
beside |
邏輯型,若 FALSE 則繪製堆積柱狀圖,若 TRUE 則繪製並列柱狀圖 |
density |
數值型,設置陰影線的填充密度(條數/英寸),默認為 NULL ,即不填充陰影線 |
angle |
數值型,填充線條的角度,默認為 45 |
border |
柱形邊緣的顏色 |
main |
標題 |
sub |
副標題 |
xlab |
x 軸標題 |
ylab |
y 軸標題 |
xlim |
x 軸範圍 |
ylim |
y 軸範圍 |
axes |
邏輯型,是否繪製坐標軸 |
用 help
命令可以查看 barplot
函數的詳細信息:
> help(barplot)
barplot package:graphics R Documentation
Bar Plots
Description:
Creates a bar plot with vertical or horizontal bars.
Usage:
barplot(height, ...)
## Default S3 method:
barplot(height, width = 1, space = NULL,
names.arg = NULL, legend.text = NULL, beside = FALSE,
horiz = FALSE, density = NULL, angle = 45,
col = NULL, border = par("fg"),
main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
xlim = NULL, ylim = NULL, xpd = TRUE, log = "",
axes = TRUE, axisnames = TRUE,
cex.axis = par("cex.axis"), cex.names = par("cex.axis"),
inside = TRUE, plot = TRUE, axis.lty = 0, offset = 0,
add = FALSE, ann = !add && par("ann"), args.legend = NULL, ...)
## S3 method for class 'formula'
barplot(formula, data, subset, na.action,
horiz = FALSE, xlab = NULL, ylab = NULL, ...)
餅圖
繪製餅圖時要多加註意,因為餅圖不一定能展示出各扇形間的區別。(LCTT 譯註:根據統計學家和一些心理學家的調查結果,這種以比例展示數據的統計圖形 實際上是很糟糕的可視化方式,因此,R 關於餅圖的幫助文件中清楚地說明了並不推薦使用餅圖,而是使用條形圖或點圖作為替代。) 用 subset
函數獲得 Gujarat 州在 2021 年 1 月 Rural、Urban、Rurual+Urban 的 CPI 值:
> jan2021 <- subset(cpi, Name=="January" & Year=="2021")
> jan2021$Gujarat
[1] 153.9 151.2 149.1
> names <- c('Rural', 'Urban', 'Rural+Urban')
使用 pie
函數為 Gujarat 州的 CPI 值生成餅圖,如下所示:
> pie(jan2021$Gujarat, names, main="Gujarat CPI Rural and Urban Pie Chart")
pie
函數可以傳入以下參數:
參數 | 描述 |
---|---|
`x | 元素大於 0 的數值向量 |
label |
字元向量,用於設置每個扇形的標籤 |
radius |
餅圖的半徑 |
clockwise |
邏輯型,若 TRUE 則順時針繪圖,若 FALSE 則逆時針繪圖 |
density |
數值型,設置陰影線的填充密度(條數/英寸),默認為 NULL ,即不填充陰影線 |
angle |
數值型,填充線條的角度,默認為 45 |
col |
數值向量,用於設置顏色 |
lty |
每個扇形的線條類型 |
main |
標題 |
箱線圖
(LCTT 譯註:箱線圖主要是 從四分位數的角度出發 描述數據的分布,它通過最大值(Q4)、上四分位數(Q3)、中位數(Q2)、下四分位數(Q1) 和最小值(Q0)五處位置來獲取一維數據的分布概況。我們知道,這五處位置之間依次包含了四段數據,每段中數據量均為總數據量的 1/4。通過每一段數據佔據的長度,我們可以大致推斷出數據的集中或離散趨勢。長度越短,說明數據在該區間上越密集,反之則稀疏。)
箱線圖能夠用「 須線 」 展示一個變數的 四分位距 (簡稱 IQR=Q3-Q1)。用上下四分位數分別加/減內四分位距,再乘以一個人為設定的倍數 range
(見下面的參數列表),得到 range * c(Q1-IQR, Q3+IQR)
,超過這個範圍的數據點就被視作離群點,在圖中直接以點的形式表示出來。
boxplot
函數可以傳入以下參數:
參數 | 描述 |
---|---|
data |
數據框或列表,用於參數類型為公式的情況 |
x |
數值向量或者列表,若為列表則對列表中每一個子對象依次作出箱線圖 |
width |
設置箱子的寬度 |
outline |
邏輯型,設置是否繪製離群點 |
names |
設置每個箱子的標籤 |
border |
設置每個箱子的邊緣的顏色 |
range |
延伸倍數,設置箱線圖末端(須)延伸到什麼位置 |
plot |
邏輯型,設置是否生成圖像,若 TRUE 則生成圖像,若 FALSE 則列印傳入數據的描述信息 |
horizontal |
邏輯型,設置箱線圖是否水平放置 |
用 boxplot
函數繪製部分州的箱線圖:
> names <- c ('Andaman and Nicobar', 'Lakshadweep', 'Delhi', 'Goa', 'Gujarat', 'Bihar')
> boxplot(cpi$Andaman.and.Nicobar, cpi$Lakshadweep, cpi$Delhi, cpi$Goa, cpi$Gujarat, cpi$Bihar, names=names)
QQ 圖
QQ 圖 可以用來對比兩個數據集,也可以用來檢查數據是否服從某種理論分布。qqnorm
函數能繪製正態分布 QQ 圖,可以檢驗數據是否服從正態分布,用下面的代碼繪製 Punjab 州 CPI 數據的 QQ 圖:
> qqnorm(punjab$x)
qqline
函數可以向正態分布 QQ 圖上添加理論分布曲線,它可以傳入以下參數:
參數 | 描述 |
---|---|
x |
第一個數據樣本 |
y |
第二個數據樣本 |
datax |
邏輯型,設置是否以 x 軸表示理論曲線的值,默認為 FALSE |
probs |
長度為 2 的數值向量,代表概率 |
xlab |
x 軸標題 |
ylab |
y 軸標題 |
qtype |
[1,9] 內的整數,設置分位計算類型,詳情見 help(quantile) 的類型小節 |
等高圖
等高圖可以描述三維數據,在 R 中對應的函數是 contour
,這個函數也可以用來向已有的圖表添加等高線。等高圖常與其他圖表一起使用。我們用 contour
對 R 中的 volcano
數據集(奧克蘭的火山地形信息)繪製等高圖,代碼如下:
> contour(volcano)
contour
函數的常用參數如下:
參數 | 描述 |
---|---|
x,y |
z 中數值對應的點在平面上的位置 |
z |
數值向量 |
nlevels |
設置等高線的條數,調整等高線的疏密 |
labels |
等高線上的標記字元串,默認是高度的數值 |
xlim |
設置 x 軸的範圍 |
ylim |
設置 y 軸的範圍 |
zlim |
設置 z 軸的範圍 |
axes |
設置是否繪製坐標軸 |
col |
設置等高線的顏色 |
lty |
設置線條的類型 |
lwd |
設置線條的粗細 |
vfont |
設置標籤字體 |
等高線之間的區域可以用顏色填充,每種顏色表示一個高度範圍,如下所示:
> filled.contour(volcano, asp = 1)
# asp 為圖形縱橫比,即 y 軸上的 1 單位長度和 x 軸上 1 單位長度的比率
填充結果見圖 8。
掌握上述內容後,你可以嘗試 R 語言 graphics
包中的其他函數和圖表(LCTT 譯註:用 help(package=graphics)
可以查看 graphics 包提供的函數列表)。
via: https://www.opensourceforu.com/2022/05/plotting-data-in-r-graphs/
作者:Shakthi Kannan 選題:lkxed 譯者:tanloong 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive