Linux中國

R 語言繪製數據:圖表篇

R 語言有非常多的繪圖和數據可視化的包,比如 graphicslatticeggplot2 等。這是 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。

Figure 1: Line chart

自相關圖

自相關圖能在時序分析中展示一個變數是否具有自相關性,可以用 R 中的 acf 函數繪製。acf 函數可以設置三種自相關類型:correlationcovariancepartial。圖 2 是 Punjab 州 CPI 值的自相關圖,x 表示 CPI。

acf(punjab$x,main=&apos;x&apos;)

Figure 2: ACF chart

acf 函數可以傳入以下參數:

參數 描述
x 一個單變數或多變數的時序對象,或者一個數值向量或數值矩陣
lag.max 最大滯後階數
type 字元型,設置所計算的自相關類型:correlationcovariancepartial
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")

Figure 3: Line chart of Punjab&apos;s CPI

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 &apos;formula&apos;
     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(&apos;Rural&apos;, &apos;Urban&apos;, &apos;Rural+Urban&apos;)

使用 pie 函數為 Gujarat 州的 CPI 值生成餅圖,如下所示:

> pie(jan2021$Gujarat, names, main="Gujarat CPI Rural and Urban Pie Chart")

Figure 4: 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。通過每一段數據佔據的長度,我們可以大致推斷出數據的集中或離散趨勢。長度越短,說明數據在該區間上越密集,反之則稀疏。)

箱線圖能夠用「 須線 whisker 」 展示一個變數的 四分位距 Interquartile Range (簡稱 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 (&apos;Andaman and Nicobar&apos;, &apos;Lakshadweep&apos;, &apos;Delhi&apos;, &apos;Goa&apos;, &apos;Gujarat&apos;, &apos;Bihar&apos;)
> boxplot(cpi$Andaman.and.Nicobar, cpi$Lakshadweep, cpi$Delhi, cpi$Goa, cpi$Gujarat, cpi$Bihar, names=names)

Figure 5: Box plot

QQ 圖

QQ 圖 Quantile-Quantile plot 可以用來對比兩個數據集,也可以用來檢查數據是否服從某種理論分布。qqnorm 函數能繪製正態分布 QQ 圖,可以檢驗數據是否服從正態分布,用下面的代碼繪製 Punjab 州 CPI 數據的 QQ 圖:

> qqnorm(punjab$x)

Figure 6: Q-Q plot

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)

Figure 7: 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。

Figure 8: Filled volcano

掌握上述內容後,你可以嘗試 R 語言 graphics 包中的其他函數和圖表(LCTT 譯註:用 help(package=graphics) 可以查看 graphics 包提供的函數列表)。

via: https://www.opensourceforu.com/2022/05/plotting-data-in-r-graphs/

作者:Shakthi Kannan 選題:lkxed 譯者:tanloong 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國