天天看点

r语言liftchart_数据可视化之R语言

r语言liftchart_数据可视化之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()图形盒子中。

4.脊柱图

和条形图不同的是,脊柱图是长度相同,宽度根据频率变化,脊柱图可以使用spineplot函数实现。

> ShiftOperator

> 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")

5.马赛克图

马赛克图可以通过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"))

6.饼图

饼图很简单,但是有时并不利于分析和观察,饼图使用pie()函数实现

> pie(Severity_Counts[1:5])

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

7.四折图

四折图是展示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

> names(resistivity2)

> 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

+ usr

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

+ h

+ breaks

+ y

+ y

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

+ }

> panel.cor

+ usr

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

+ r

+ txt

+ txt

+ if(missing(cex.cor)) cex.cor

+ 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)

转载!