散点图
2018-09-03
2018-09-03
1 数据集读取
library(gcookbook) #调取系统数据集包
str(heightweight) #查看数据情况
## 'data.frame': 236 obs. of 5 variables:
## $ sex : Factor w/ 2 levels "f","m": 1 1 1 1 1 1 1 1 1 1 ...
## $ ageYear : num 11.9 12.9 12.8 13.4 15.9 ...
## $ ageMonth: int 143 155 153 161 191 171 185 142 160 140 ...
## $ heightIn: num 56.3 62.3 63.3 59 62.5 62.5 59 56.5 62 53.8 ...
## $ weightLb: num 85 105 108 92 112 ...
数据集为数据框,记录了236个学龄儿童,含有5个字段信息。含义如下所示:
变量 | 变量类型 | 变量含义 |
---|---|---|
性别 | 因子型 | 学龄儿童的性别 |
年龄 | 数值型 | 学龄儿童的年龄 |
月龄 | 整数型 | 学龄儿童的月龄 |
身高 | 数值型 | 学龄儿童的身高 |
体重 | 数值型 | 学龄儿童的体重 |
结合数据集信息,对数据结构类型进行可视化分析。
2 绘制散点图
散点图能反映两个连续变量数据的分布趋势和数据的密集程度。可以选择用plot函数绘制简单散点图,基本书写格式有两种,如下所示:
plot(数据 $自变量,数据 $因变量)
plot(因变量~自变量,data=数据)
在图形的绘制中,有时会对图形的显示进行一定的分栏显示,如下:
par(mfrow=c(1,2))#设置画图为1行2列的格式
plot(heightweight$ageYear,heightweight$heightIn,pch=20,main="学龄儿童的年龄与身高散点图",xlab="年龄",ylab="身高",col="red") #绘制散点图
plot(heightIn~ageYear,data=heightweight,main="学龄儿童的年龄与身高散点图",xlab="年龄",ylab="身高",col="green",pch=20) #添加回归线拟合
lm<-lm(heightIn~ageYear,data=heightweight) # 建立一元线性回归
abline(lm$coefficients) # 添加回归线
loess<-loess(heightIn~ageYear,data=heightweight) # 局部加权散点平滑法
ord<-order(heightweight$ageYear) # 升序排序
lines(heightweight$ageYear[ord],loess$fitted[ord],lwd=1,lty=1,col=2) #按照x轴排序后绘图
关于散点图,往往具备一定的趋势走向,需要添加回归线,进行近似拟合。常使用一元线性回归函数进行拟合,基本书写格式为:lm(因变量~自变量,data=数据)
利用abline函数添加回归线,书写格式为:abline(数值型向量),通过拟合曲线,可以看出12-16岁的学龄儿童随着年龄增加,体重增长快速,然后趋于平缓。
当数据样本量较大时,所绘制的散点图的点可能非常集中,极不利于观察散点图的数据分布,因此采用高密度散点图处理的方法观察其数据分布。
需要用hexbin包里的hexbin函数进行高密度散点图处理,hexbin包中的hexbin函数将二元变量的封箱放到六边形单元格中,用六边形形象地描述各个箱体,如下所示:
library(hexbin) #调用高密度散点图包
hex<-hexbin(heightweight$ageYear,heightweight$weightLb,xbins=20)#处理高密度散点图
plot(hex,main="学龄儿童的年龄与体重散点图",xlab="年龄",ylab="体重")#绘制散点图
由上述图形可以看出,点颜色较深主要集中在17岁以下。
ggplot(heightweight,aes(x=ageYear,y=weightLb,colour=heightIn))+geom_point()
如下图所示,使用ggplot函数,对散点颜色依据heightIn进行划分,发现点的颜色较深主要集中在heightIn为60以下。
ggplot(heightweight,aes(x=ageYear,y=weightLb,size=heightIn))+geom_point(col="lightgreen")
由上图知,对散点颜色依据heightIn进行划分,发现绿色圆形符号较大主要集中在heightIn为65以上。
library(readxl)
jsdata=read_excel("D:/TASK/净水器建模(1月19日)副本1.xlsx")
library(ggplot2)
ggplot(jsdata, aes(x=人气,y=销量,colour=销量))+geom_point(col="red",pch=17)+
geom_smooth(col="green")+ #添加点
annotate("text",x =9, y = 9,parse = T,
label = "x[1] == x[2]") #添加注释
上图表示随着人气值的增加销量也随之增加且趋于平缓。
3 绘制三维散点图
当数据涉及到三个维度时,常规的散点图,不能体现出数据的特征,需要用三维的空间图形进行描述,如下所示:
由上图可知,X、Y和Z的空间分布关系。
library(scatterplot3d)
Z<-seq(-20,20,0.01)
X<-cos(Z)
Y<-sin(Z)
scatterplot3d(X,Y,Z,highlight.3d=TRUE,col.axis="blue",col.grid="lightblue",main="螺旋回升图")
由上图可知,Z的取值为-20到20,X和Y分别取cos(Z)和sin(Z),得出三者在空间分布关系。
m <- seq(-pi, 0, length = 40)
x <- c(rep(1, 40) %*% t(cos(m)))
y <- c(cos(m) %*% t(sin(m)))
z <- c(sin(m) %*% t(sin(m)))
scatterplot3d(x, y, z, highlight.3d=TRUE,
col.axis="grey", col.grid="lightblue",
main="三维散点图", pch=20)
由上图可知,取数集m值在-pi到0之间,取半个周期的正弦和余弦面积,组合成半球体形状。
m <- seq(-pi, 0, length = 40)
x <- c(rep(1, 40) %*% t(cos(m)))
y <- c(cos(m) %*% t(sin(m)))
z <- 10 * c(sin(m) %*% t(sin(m)))
color <- rep("green", length(x))
m <- seq(-10, 10, 0.01)
x <- c(x, cos(m))
y <- c(y, sin(m))
z <- c(z, m)
color <- c(color, rep("red", length(m)))
scatterplot3d(x, y, z, color, pch=20, zlim=c(-2, 10),
main="三维散点图")
由上图可知,结合半球形状和螺旋上升,组合成图形如上所示,反映出随着点的上升,螺旋线中的点对应上升。其它三维图形绘制如下所示:
cubedraw <- function(res3d, min = 0, max = 255, cex = 2, text. = FALSE)
{
## Purpose: Draw nice cube with corners
cube01 <- rbind(c(0,0,1), 0, c(1,0,0), c(1,1,0), 1, c(0,1,1), # < 6 outer
c(1,0,1), c(0,1,0)) # <- "inner": fore- & back-ground
cub <- min + (max-min)* cube01
## visibile corners + lines:
res3d$points3d(cub[c(1:6,1,7,3,7,5) ,], cex = cex, type = 'b', lty = 1)
## hidden corner + lines
res3d$points3d(cub[c(2,8,4,8,6), ], cex = cex, type = 'b', lty = 3)
if(text.)## debug
text(res3d$xyz.convert(cub), labels=1:nrow(cub), col='tomato', cex=2)
}
## 6 a) The named colors in R, i.e. colors()
cc <- colors()
crgb <- t(col2rgb(cc))
par(xpd = TRUE)
rr <- scatterplot3d(crgb, color = cc, box = FALSE, angle = 24,
xlim = c(-50, 300), ylim = c(-50, 300), zlim = c(-50, 300))
cubedraw(rr)
由上图可知,结合对角线可以判断出散点分布的区域,对不同区域点进行划分。
4 本章汇总
参数 | 类别 | 功能 |
---|---|---|
par() | 函数 | 图形展示的分栏设置 |
plot() | 函数 | 用于散点图的绘制 |
main | 参数 | 标题 |
xlab | 参数 | 设置横坐标 |
ylab | 参数 | 设置纵坐标 |
pch | 参数 | 线形 |
order | 函数 | 排序 |
lty | 参数 | 线形粗细 |
geom_point | 函数 | 绘制点形 |
readxl | 包 | 读取EXCEL数据包 |
gcookbook | 包 | 用于调取内部数据集 |
lm() | 函数 | 利用lm()的线性回归估计数值 |
abline() | 函数 | 添加回归线 |
5 参考文献
[1] 周志华. 机器学习 : = Machine learning[M]. 清华大学出版社, 2016.
[2] 黄文, 王正林. 数据挖掘 : R语言实战[M]. 电子工业出版社, 2014.
[3]WinstonChang. R数据可视化手册[M]. 人民邮电出版社, 2014.