R語言之數據可視化

R中有四大框架用於產生圖形,基本圖形,網格,格子和ggplot2.

分類數據的可視化使用條形圖、點圖、柱形圖、脊柱圖、馬賽克圖、餅圖及四折圖

連續數據的可視化使用箱線圖、直方圖、散點圖及其變種、帕累托圖

==============================================

一、分類數據的可視化

1.條形圖

條形圖可以通過graphics庫中的barplot函數實現,也可以通過lattice包的barplot函數實現,我們使用RSADBE包中的數據進行舉例

(1)

> library(RSADBE)

> data("Severity_Counts")

> library(lattice)

> barchart(Severity_Counts,xlab="bug count",xlim=c(0,12000))

載入數據包和數據集,xlab設置圖表名稱,xlim設置頻數範圍。

(2)

> library(lattice)

> barplot(Severity_Counts,xlab="bug count",horiz=TRUE,xlim = c(0,12000))

horize設置為TRUE表示生成條形圖

(3)

> data(Bug_Metrics_Software)

> barplot(Bug_Metrics_Software[,,1],beside=TRUE,col = c("lightblue", "mistyrose", "lightcyan", "lavender", "cornsilk"),legend = c("JDT","PDE","Equinox","Lucene", "Mylyn")) title(main = "Before Release Bug Frequency", font.main = 4)

beside=TRUE意為圖形相鄰,如果不設置則為堆積柱形圖,col為設置顏色,legend為設置圖例

(4)

> par(mfrow=c(1,2))

> barplot(Bug_Metrics_Software[,,1],beside = TRUE)

> barplot(Bug_Metrics_Software[,,2],beside = TRUE)

par(mfrow=c(1,2))意為將兩個圖並列顯示在一張圖表上

2.點圖

點圖,也稱為克利夫蘭點圖,可以使用graphics包中的dotchart和lattice包中的dotplot實現

(1)

>dotchart(Severity_Counts,col=15:16,lcolor="black",pch=2:3,labels=names(Severity_Counts),main="Dot Plot for the Before and After Release Bug Frequency",cex=1.5)

col=15:16用於設置顏色,lcolor設置穿過點的線的顏色,pch=2:3,用於設置點的表示圖形,labels和main用於設置顯示的信息,cex=1.5表示標籤字體放大5倍

(2)

> par(mfrow=c(1,2))

> dotchart(Bug_Metrics_Software[,,1],gcolor=1:5,col=6:10,lcolor = "black",pch=15:19,labels=names(Bug_Metrics_Software[,,1]), main="Before Release Bug Frequency",xlab="Frequency Count")

> dotchart(Bug_Metrics_Software[,,2],gcolor=1:5,col=6:10,lcolor = "black",pch=15:19,labels=names(Bug_Metrics_Software[,,2]), main="After Release Bug Frequency",xlab="Frequency Count")

將兩組點圖放在一張圖上顯示。

3.折線圖

折線圖對於分類數據和連續型數據都適用,如果數據為連續數據,則使用plot()命令就可實現,只要設置type=選項即可,如:

> plot(Nile,type="l")

如果數據的順序是任意的,那麼做出的折線也是任意的,這樣無法觀察趨勢,因此需要將其排序一下,使其具有某種趨勢,如:

> plot(sort(mf$Length),mf$NO3,type="l")

對於分類數據,如果直接使用plot()的話,橫軸將無法顯示標籤值,此時需要自行添加,如:

> plot(rain,type="b",axes = FALSE,xlab="month",tlab=rain)

> month=c("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec")

> axis(side=1,at=1:length(rain),labels=month)

> axis(side=2)

> box()

首先使用axes=FALSE關閉坐標軸,然後使用axis()重新定義x軸,side=1表示希望在哪個方向建立坐標軸,1表示底部,2表示左側,3表示頂部,4表示右側。at=表示顯示坐標點數的位置,要以1:n的形式指定,labels為標籤名。最後將其封裝在box()圖形盒子中。

3.脊柱圖

和條形圖不同的是,脊柱圖是長度相同,寬度根據頻率變化,脊柱圖可以使用spineplot函數實現。

> ShiftOperator <- matrix(c(40, 35, 28, 26, 40, 22, 52, 46, 49),nrow=3,dimnames=list(c("Shift 1", "Shift 2", "Shift 3"), c("Operator 1", "Opereator 2", "Operator 3")),byrow=TRUE)

> spineplot(ShiftOperator)

> abline(h=0.33,lwd=3,col="red")

> abline(h=0.67,lwd=3,col="red")

> abline(v=0.33,lwd=3,col="green")

> abline(v=0.67,lwd=3,col="green")

4.馬賽克圖

馬賽克圖可以通過mosaicplot函數實現,我們使用Titanic數據進行舉例

> xtabs(Freq~Class,data=Titanic)

> prop.table( xtabs(Freq~Class+Survived,data=Titanic),margin=1)

> xtabs(Freq~Sex,data=Titanic)

> prop.table(xtabs(Freq~Sex+Survived,data=Titanic),margin=1)

> xtabs(Freq~Age,data=Titanic)

> prop.table(xtabs(Freq~Age+Survived,data=Titanic), margin=1)

> mosaicplot(Titanic,col=c("red","green"))

5.餅圖

餅圖很簡單,但是有時並不利於分析和觀察,餅圖使用pie()函數實現

> pie(Severity_Counts[1:5])

> title("Severity Counts Post-Release of JDT Software")

6.四折圖

四折圖是展示2*2*k的三維列聯表的一種方式,這種方法是獲得k個2*2的列聯表的餅圖,列聯表的四個子區域的頻率用四分之一圓表示,半徑和頻率的平方根成比例,和餅圖相比,四折圖的半徑是不同的。四折圖可以使用fourfoldplot函數實現

> fourfoldplot(UCBAdmissions,mfrow=c(2,3),space=0.4)

===================================================

二、連續型變數數據的可視化

1.箱線圖

箱線圖基於最小值、下四分位數、中位數、上四分位數和最大值組成,可以使用graphics包中的boxplot函數和lattice包中的bwplot函數實現,如

(1)

> library(RSADBE)

> data(resistivity)

> boxplot(resistivity, range=0)

(2)

> library(lattice)

> resistivity2 <- data.frame(rep(names( resistivity),each=8),c(resistivity[,1],resistivity[,2]))

> names(resistivity2)<- c("Process","Resistivity")

> bwplot(Resistivity~Process, data=resistivity2,notch=TRUE)

我們可以通過添加一些設定,來對圖表進行優化,如

> boxplot(fw$count,fw$speed,names = c("count","speed"),xlab="var",ylab="value",range = 0,col="gray90")

設定name為數據標籤,xlab和ylab為坐標值標籤,range為箱線的延伸範圍至最大值和最小值,col為箱型顏色。

可以通過設置horizontal=TRUE將箱線圖調為水平格式,此外,如果數據為數據框並且為響應變數和預測分組變數的形式,則可以使用公示語法——響應變數~預測變數的形式,如

> boxplot(grass$rich~grass$graze,data=grass,horizontal=TRUE,range=0)

響應變數rich在左側,預測變數(分組變數)graze在右側,同時設置為水平箱線圖。

2.直方圖

直方圖可以通過hist函數和histogram函數實現,我們使用galton數據作為舉例

> data(galton)

> par(mfrow=c(2,2))

> hist(galton$parent,breaks="FD",xlab="Height of Parent", main="Histogram for Parent Height with Freedman-Diaconis Breaks",xlim=c(60,75))

> hist(galton$parent,xlab="Height of Parent",main= "Histogram for Parent Height with Sturges Breaks",xlim=c(60,75))

> hist(galton$child,breaks="FD",xlab="Height of Child", main="Histogram for Child Height with Freedman-Diaconis Breaks",xlim=c(60,75))

> hist(galton$child,xlab="Height of Child",main="Histogram for Child Height with Sturges Breaks",xlim=c(60,75))

此外,還有一些選項可以對直方圖進行設置,這些選項適用於大多數圖形命令

col:圖形顏色

main:圖形標題

xlab:X軸標題

ylab:Y軸標題

xlim:X軸範圍

ylim:Y軸範圍

break:設置直方圖的分割範圍

freq:邏輯選項,TRUE為生成頻率數據,FALSE為生成概率密度數據

3.散點圖

直方圖可以用來理解變數的性質,散點圖可以用來理解變數間的關係,兩個變數可以使用plot(x,y)函數,x,y為兩個向量,如果數據為兩列數據框,則會默認將第一列作為x,第二列作為y,如果為多列數據框,則會生成散點圖矩陣,可以使用pairs函數做散點圖矩陣,例如:

(1)

> data(DCD)

> plot(DCD$Drain_Current, DCD$GTS_Voltage,type="b",xlim=c(1,2.2),ylim=c(0.6,2.4),xlab="Current Drain", ylab="Voltage")

> points(DCD$Drain_Current,DCD$GTS_Voltage/1.15,type="b",col="green")

points函數用來向圖表中加入其它點,plot()同樣可以使用xlab和ylab自定義坐標軸標籤。

可以通過設置pch=選項來定義散點圖形,pch的值可以設為0-25的數字,每個數字對應一個符號,如:

> plot(0:25,rep(1,26),pch=0:25,cex=2)

該命令中,我們將x設為0-25的數字,y為1並通過rep命令重複26次,cex=調整字元大小。

除了0-25的數字之外,還可以直接輸入想要的符號,如:

> plot(fw$count,fw$speed,pch="+",cex=4,col="gray90")

該例中,我們將符號設為了+,字元大小cex設為4,顏色col設為灰色

plot()會根據數據計算坐標值最佳刻度,也可以通過xlim=(start,end)和ylim=(start,end)自定義設置,如:

> plot(fw$count,fw$speed,xlim=c(0,30),ylim=c(0,50))

plot()也可以使用公式語法,~左側為因變數,右側為自變數,如:

> plot(count~speed,data=fw)

可以使用abine()為散點圖添加直線,abline()實際上是一個畫直線的命令,lwd=設定線的寬度,lty=設定線條類型,值為0-6,如:

> abline(lm(count~speed,data=fw),lty=3,lwd=2,col="gray90")

如果數據為多列數據框,會生成所有變數的散點圖矩陣,也可以只選擇某些變數,但此時就不能使用$了,而要使用公式形式,如:

plot(~Length+Speed+NO3,data = mf)

pairs(~Length+Speed+NO3,data = mf)

此時,~左側可以不需要因變數。

(2)

如果變數較多,使用散點圖矩陣會將所有圖全部顯示,但是散點圖矩陣是對稱的,我們只需顯示一半即可,因此需要自定義兩個函數,如:

> panel.hist <- function(x, ...) {

+ usr<- par("usr"); on.exit(par(usr))

+ par(usr = c(usr[1:2], 0, 1.5) )

+ h <- hist(x, plot = FALSE)

+ breaks<- h$breaks; nB<- length(breaks)

+ y <- h$counts;

+ y <- y/max(y)

+ rect(breaks[-nB], 0, breaks[-1], y, col="cyan", ...)

+ }

> panel.cor <- function(x, y, digits=2, prefix="", cex.cor, ...) {

+ usr<- par("usr"); on.exit(par(usr))

+ par(usr = c(0, 1, 0, 1))

+ r <- abs(cor(x,y,use="complete.obs"))

+ txt<- format(c(r, 0.123456789), digits=digits)[1]

+ txt<- paste(prefix, txt, sep="")

+ if(missing(cex.cor)) cex.cor<- 0.8/strwidth(txt)

+ text(0.5, 0.5, txt, cex = cex.cor * r)

+ }

> data(Gasoline)

> pairs(Gasoline,diag.panel=panel.hist,lower.panel=panel.smooth,upper.panel=panel.cor)

如果變數較多,使用散點圖矩陣會將所有圖全部顯示,但是散點圖矩陣是對稱的,我們只需顯示一半即可,因此需要自定義兩個函數。

4.帕累托圖

帕累托法則也稱為80-20法則,帕累托圖就是基於此生成的,可以使用qcc包的pareto.chart函數實現。

> library(qcc)

> Reject_Freq = c(9,22,15,40,8)

> names(Reject_Freq) = c("No Addr.", "Illegible", "Curr. Customer", "No Sign.", "Other")

> Reject_Freq

> options(digits=2)

> pareto.chart(Reject_Freq)

---------------------

大家也可以加小編微信:tswenqu(備註:知乎),進R語言中文社區 交流群,可以跟各位老師互相交流


推薦閱讀:

有趣!如何用Python-matplotlib繪製雙層餅圖及環形圖?
10分鐘python圖表繪製 | seaborn入門(一):distplot與kdeplot
用R語言復盤美國總統大選
仿ECO事件圓環圖

TAG:R编程语言 | 数据可视化 | 数据分析 |