R語言之數據可視化
01-25
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事件圓環圖