首页 > 代码库 > R语言之数据可视化

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=http://www.mamicode.com/Titanic)
> prop.table( xtabs(Freq~Class+Survived,data=http://www.mamicode.com/Titanic),margin=1)
> xtabs(Freq~Sex,data=http://www.mamicode.com/Titanic)
> prop.table(xtabs(Freq~Sex+Survived,data=http://www.mamicode.com/Titanic),margin=1)
> xtabs(Freq~Age,data=http://www.mamicode.com/Titanic)
> prop.table(xtabs(Freq~Age+Survived,data=http://www.mamicode.com/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=http://www.mamicode.com/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=http://www.mamicode.com/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=http://www.mamicode.com/fw)

可以使用abine()为散点图添加直线,abline()实际上是一个画直线的命令,lwd=设定线的宽度,lty=设定线条类型,值为0-6,如:
> abline(lm(count~speed,data=http://www.mamicode.com/fw),lty=3,lwd=2,col="gray90")

如果数据为多列数据框,会生成所有变量的散点图矩阵,也可以只选择某些变量,但此时就不能使用$了,而要使用公式形式,如:
plot(~Length+Speed+NO3,data = http://www.mamicode.com/mf)
pairs(~Length+Speed+NO3,data = http://www.mamicode.com/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)


R语言之数据可视化