原创:如何用R语言绘制折线图,展现多维(四维)以上数据
发布时间:2017-08-11 20:32:28
发布时间:2017-08-11 20:32:28
我相信,你能够用图形灵活展示二维数据、三维的数据,甚至四维的数据!
可是,你能够在同一个图形中同事展现多个维度(四维以上)的数据吗?恐怕很多人都认为很难。
遗憾的是,现实生活中,我们经常需要在同一个图形中同事展现多个维度(四维以上)的数据,因为每一个统计研究个体往往都有十几个,上百个指标。
遗憾的是,我们很容易能够使用的一般的统计图形对于展现低维度(例如,2维),具有直观、形象、生动、具体等特点,但是对于展现高维度则显得力不从心。
本文介绍一种简单的折线图,能够在同一个图形中同事展现多个维度(四维以上)的数据。本文将如何结合一个具体的数据,从简单到复杂,介绍如何使用R语言绘制这样的图形。
例如,为了了解购买某产品的客户特征,收集了客户的20种属性,例如,年龄、年收入、性别等,打算用图形观察属性间的关系特征:图1用散点图展现的是两个维度——年收入与年龄,可以轻松看出年收入和年龄是没有关系的;图2通过点的颜色,能够多展现一维——isbuy是否购买,可以轻松看出购买者主要是低收入者,但是和年龄没有关系;图3展现了四维——增加了性别,可以看出女性几乎不买,男性只有低收入的才会买,高收入的不会买。
从三幅图中,可以看到图形能够展现四维,可是,图4区能够展示两个年度13个指标的数据,从中两个年度13个指标的走势,可以看出两个年度各个指标的差异程度与联系程度,由此可以看出图4的优势了?
接下来,我一步一步看看,如何实现这个图形
图1 图3
图3
图4
首先,将这个数据存成文件:A.CSV
2016 | 2015 | 增长率(%) | 权重 | |
1.1、 对所学专业 | 0.3171 | 0.3006 | 5.4655 | 1.0000 |
1.2、 对教师教学态度 | 0.3280 | 0.3027 | 8.3773 | 1.0000 |
1.3、 对教师教学水平 | 0.3254 | 0.3039 | 7.0745 | 1.0000 |
1.4、 对教学方法与手段 | 0.3116 | 0.2918 | 6.7912 | 2.0000 |
1.5、 对课程设置 | 0.2970 | 0.2684 | 10.6891 | 2.0000 |
1.6、 对教材选用 | 0.3012 | 0.2799 | 7.6265 | 1.0000 |
1.7、 对课外辅导与作用 | 0.2969 | 0.2684 | 10.6156 | 1.0000 |
1.8、 对职业能力训练 | 0.3085 | 0.2927 | 5.4062 | 2.0000 |
2.1、 对学风考风 | 0.3185 | 0.3036 | 4.9126 | 1.0000 |
2.2、 对实验、实习、实践质量 | 0.3104 | 0.2898 | 7.0993 | 2.0000 |
2.3、 对就业创业指导 | 0.3071 | 0.2871 | 6.9888 | 1.0000 |
3.1、 对教室和自习场所 | 0.3077 | 0.2878 | 6.9092 | 1.0000 |
3.2、 对实验室条件和使用 | 0.3031 | 0.2758 | 9.9088 | 1.0000 |
alldata=read.csv("d:\\A.csv") #读入数据
t=1:13 #13个指标,要转换为x轴上的13个点
plot(t,alldata$X2016,type='o',pch=4)
Type和pch的含义,参考PLOT参数说明
X轴,希望能够显示具体的指标名称,如何实现?
plot(alldata$X,alldata$X2016,type='o',pch=4)
?其他都一样,就是x参数不一样了,图形有非常大的变化
从理论上看,这个语句能够直接实现题目最早的意图了,但是实际结果却不尽人意
关键语句:
par(new=T)
完整过程:
plot(t,alldata$X2016,type='o',pch=4)
par(new=T)
plot(t,alldata$X2015,type='o',pch=4)
结果:
问题:y轴坐标重叠错乱了(注意观察y轴),并且刻度不一样,两条线一些点不一样,但是却被绘制成重叠在一起了。
看来不能简单讲两个线条或图形叠加。
iCols=13
ydata=cbind(alldata$X2016,alldata$X2015)
yScale=c(max(ydata),min(ydata),rep(0, iCols-2))
--yScale和xScale的长度和实际要绘制图形的数据要一致,所以,这里需要调整
xScale=c(1:iCols)
--关键绘制一个空的图结构
plot(xScale, yScale,type='n')
然后在开始绘制图形
par(new=T)
plot(xScale,alldata$X2016,type='o',pch=4)
par(new=T)
plot(xScale,alldata$X2015,type='o',pch=4)
****************遗憾的是,以上的努力没有收到预期效果
---
iCols=13
ydata=cbind(alldata$X2016,alldata$X2015)
xScale=c(1:iCols)
plot(xScale,alldata$X2015,col=3, type='o',ylim=c(max(ydata)+0.05,min(ydata)-0.05))
par(new=T)
plot(xScale,alldata$X2016,col=4, type='o',ylim=c(max(ydata)+0.05,min(ydata)-0.05))
注意这里的两个参数:
ylim、color
类似的还有xlim
注意ylim的大小反了,结果图形y坐标也是反的
问题:x轴为什么不能间隔1?
plot(xScale,alldata$X2015,col=3, type='o',ylim=c(min(ydata)-0.05,max(ydata)+0.05) ,cex=alldata$权重,pch=16)
par(new=T)
plot(xScale,alldata$X2016,col=4, type='o',ylim=c(min(ydata)-0.05,max(ydata)+0.05),cex=alldata$权重,pch=16)
注意参数cex
plot(xScale,alldata$X2015,col=3, type='o',ylim=c(min(ydata)-0.05,max(ydata)+0.05) ,cex=alldata$权重,pch=16,xaxt= "n")
par(new=T)
plot(xScale,alldata$X2016,col=4, type='o',ylim=c(min(ydata)-0.05,max(ydata)+0.05),cex=alldata$权重,pch=16,xaxt= "n")
axis(1,1:13)
注意参数xaxt
a=c("2015","2016")
legend("bottomright", as.matrix(a), pch=1,text.col=c(3,4))
注意函数legend
iCols=13
ydata=cbind(alldata$X2016,alldata$X2015)
xScale=c(1:iCols)
plot(xScale,alldata$X2015,col=3, type='o',ylim=c(min(ydata)-0.05,max(ydata)+0.05) ,cex=alldata$权重,pch=16,xaxt= "n",xlab="指标",ylab="满意度得分")
par(new=T)
plot(xScale,alldata$X2016,col=4, type='o',ylim=c(min(ydata)-0.05,max(ydata)+0.05),cex=alldata$权重,pch=16,xaxt= "n",xlab="指标",ylab="满意度得分")
axis(1,1:13)
title("2015和2016满意度指标对比图")
a=c("2015","2016")
legend("bottomright", as.matrix(a), pch=1,text.col=c(3,4))
注意参数xlab\ylab和函数title
op <- par(mar=c(12,5,3,3)+.1)
iCols=13
ydata=cbind(alldata$X2016,alldata$X2015)
xScale=c(1:iCols)
plot(xScale,alldata$X2015,col=3, type='o',ylim=c(min(ydata)-0.05,max(ydata)+0.05) ,cex=alldata$权重,pch=16,xaxt= "n",xlab="",ylab="满意度得分")
par(new=T)
plot(xScale,alldata$X2016,col=4, type='o',ylim=c(min(ydata)-0.05,max(ydata)+0.05),cex=alldata$权重,pch=16,xaxt= "n",xlab="",ylab="满意度得分")
title("2015和2016满意度指标对比图")
a=c("2015","2016")
legend("bottomright", as.matrix(a), pch=1,text.col=c(3,4))
axis(side=1, 1:13, tcl=-0.2, labels=B,las=2)
注意参数par函数,axis的las参数,和plot的las参数一样
线条类型:散点图,还是线图,由这个参数决定
图形点的形状
x坐标轴的范围
y坐标轴的取值范围
ylim=c(最小值,最大值)
col=某个数字
用来绘制点面积用
cel=某个数
随即帮助说明如下:
set.seed(1000)
x<-seq(-1,2,length.out=100)
y<-dexp(x,0.5)
plot(x,y,col="red",xlim=c(0,2),ylim=c(0,5),type='l',xaxs="i", yaxs="i",ylab='density',xlab='',main="The Exponential Density Distribution")
lines(x,dexp(x,1),col="green")
lines(x,dexp(x,2),col="blue")
lines(x,dexp(x,5),col="orange")
legend("topright",legend=paste("rate=",c(.5, 1, 2,5)), lwd=1,col=c("red", "green","blue","orange"))