#中级绘图
#散点图
#用于描述两个连续型变量间(x,y)的关系
#范例一
attach(mtcars)
plot(wt,mpg,
main="Basic Scatter plot of MPG vs. Weight",
xlab="Car Weight (lbs/1000)",
ylab="Miles Per Gallon ",
pch=19) #画散点图,wt对应横坐标,mpg对应纵坐标
abline(lm(mpg~wt),col="red",lwd=2,lty=1) #加回归线
#lowess() 平滑拟合曲线
#loess()是基于lowess的更新和更强大的拟合函数
#用来添加一条平滑曲线,基于局部加权多项式回归的非参数方法
lines(lowess(wt,mpg),col="blue",lwd=2,lty=2)
detach(mtcars)
#比较abine,lines
#都能用于在原图上添加直线或者折线
#line(x,y),基本功能相当于plot(x,y,type="1"),plot()函数被调用即可创建新图
#而line函数是在已存在的图形上添加信息,并不能自己生成图形
#abline(a,b),表示一条y=ax+b的直线
#abline(h=y),水平画一条线垂直于纵轴
#abline(v=x),垂直画一条线于x轴
#abline(lm.obj),传入线性模型对象,画线性方程
#范例二
library(carData)
library(car)
#模型中的分组变量,必须从"numeric"类型首先转换成Factor类型,
#否则会提示Error in if (counts[i] == 0) next : argument is of length zero
x <- mtcars[,c("mpg","wt","cyl")]
x$cyl <- as.factor(x$cyl) #强制转换,从numeric到Factor类型
class(x$cyl)
#mpg~wt|cyl,表示按照cyl水平(4,6,8)分别绘制mpg和wt的关系图
#span,控制loess平滑曲线的平滑量,参数值越大,拟合的越好
#boxplots='xy',对应wt,mpg的边界箱线图
#legend.plot,表明在左上界添加图例
with(x,
scatterplot(mpg~wt|cyl, data=x,lwd=2,span=0.9,
main='Scatter Plot of MPG vs Weight by # Cylinders',
xlab='Weight of Car (lbs/1000)',
ylab='Miles Per Gallon',
legend.plot=TRUE,
id.method="identify", #这个选项看不出效果
boxplots='xy')
)#labels=row.names(x),加进去就报错
#散点图矩阵
#范例一
#~右边表示所有变量
#关于主对角线对称的图形,相同
#指定变量间的二元关系
pairs(~mpg+disp+drat+wt,data=mtcars,main="Basic Scatter Plot Matrix")
pairs(~mpg+disp+drat+wt,data=mtcars,
main="Basic Scatter Plot Matrix",
upper.panel=NULL) #仅显示下三角六副图
pairs(~mpg+disp+drat+wt,data=mtcars,
main="Basic Scatter Plot Matrix",
lower.panel=NULL) #仅显示上角六副图
#范例二
library(car)
#~右边表示所有变量
#非对角线上的每副图默认添加线性和平滑(loess)拟合曲线
#对角线上的每副图增加核密度图,下方增加轴须图
#smooth
#spread=FALSE,表示不添加分散度和对称信息的直线,
#仅一条虚线,表示平滑曲线
#三条虚线,其中两条表示分散度和对称信息
scatterplotMatrix(~mpg+disp+drat+wt,data=mtcars,
smooth=list(spread=FALSE),
main="Scatter Plot Matrix via car Package"
)
#高密度散点图
#范例一
#数据点重叠严重时,用散点图来观察变量关系就会显得“力不从心”
set.seed(1234) #设定随机种子,方便重现运算结果
n <- 10000
c1 <- matrix(rnorm(n,mean=0,sd=0.5),ncol=2)
c2 <- matrix(rnorm(n,mean=3,sd=2),ncol=2)
mydata <- rbind(c1,c2)
mydata <- as.data.frame(mydata)
names(mydata) <- c("x","y")
with(mydata,
plot(x,y,pch=19,main="Scatter Plot with 10,000 Observatiions")
)#随机数画图
#范例二
#用核密度估计生成颜色密度来表示点分布的散点图
#颜色深的部分,表示数据集中,量比较多
with(mydata,
smoothScatter(x,y,main="Scatter Plot Colored by Smoothed Densities")
)
#范例三
#将二元变量的封箱放到六边形单元格中
#比颜色更直观些
#xbins 划分xbnd范围的箱子数
library(hexbin)
with(mydata,{
bin <- hexbin(x,y,xbins=50)
plot(bin,main="Hexagonal Binning with 10,000 Observations")
}#包含两条语句,用大括号
)
bin <- hexbin(mydata$x,mydata$y,xbins=50)
class(bin) #返回package,此对象可以直接被plot画图
#三维散点图
#散点图和散点图矩阵展示的都是二元变量关系
#对三个定量变量的交互关系进行可视化,必须使用三维散点图
#范例一
#wt, 被绘制在x轴上
#disp, 被绘制在y轴上
#x,y轴,位于底面
#mpg, 被绘制在透视轴上
library(scatterplot3d)
attach(mtcars)
scatterplot3d(wt,disp,mpg,main="Baisc 3D Scatter Plot")
detach(mtcart)
#范例二
#wt, 被绘制在x轴上
#disp, 被绘制在y轴上
#x,y轴,位于底面
#mpg, 被绘制在透视轴上
#highlight.3d=TRUE
#points will be drawn in different colors related to y coordinates
#(only if type = "p" or type = "h", else color will be used).
#type
#character indicating the type of plot: "p" for points,
#"l" for lines, "h" for vertical lines to x-y-plane, etc.
library(scatterplot3d)
attach(mtcars)
scatterplot3d(wt,disp,mpg,
pch=16, #设置图形符号
highlight.3d=TRUE, #设置颜色
type="h",#将点与地面垂直连线
main="Baisc 3D Scatter Plot")
detach(mtcart)
#范例三
#wt, 被绘制在x轴上
#disp, 被绘制在y轴上
#x,y轴,位于底面
#mpg, 被绘制在透视轴上
#highlight.3d=TRUE
#points will be drawn in different colors related to y coordinates
#(only if type = "p" or type = "h", else color will be used).
#type
#character indicating the type of plot: "p" for points,
#"l" for lines, "h" for vertical lines to x-y-plane, etc.
library(scatterplot3d)
attach(mtcars)
s3d <- scatterplot3d(wt,disp,mpg,
pch=16, #设置图形符号
highlight.3d=TRUE, #设置颜色
type="h",#将点与地面垂直连线
main="Baisc 3D Scatter Plot")
class(s3d) #返回list
#追加回归面
#z对应y因变量
#x,y对应预测变量
fit <- lm(mpg~wt+disp) #生成线性模型
#平面代表预测值
#图中的点代表实际值
#平面到点的垂直距离表示残差
#若点在平面之上表明它的预测值被低估了
#若点在平面之下表明它的预测值被高估了
s3d$plane3d(fit)
detach(mtcart)
#旋转的三维散点图
#范例一
install.packages("rgl")
library(rgl)
attach(mtcars)
#wt,对应x
#disp,对应y
#mpg,对应透视轴
#立方体的形式,拖拽立方体,可以使其任意旋转
plot3d(wt,disp,mpg,col="red",size=5)
#范例二
#支持旋转
#切面的形式
#包含各种回归曲面,比如线性,二次,平滑,附加等类型;
#默认添加线性平面
library(car)
with(mtcars,
scatter3d(wt,disp,mpg)
)
#气泡图
#一般来说,统计人员倾向于避免使用气泡图,原因和避免使用饼图一样
#相对于长度的判断,人们对于体积、面积的判断统称更困难
#但气泡图在商业应用中非常受欢迎;
#三维散点图可以来展示三个定量变量间的关系,现在介绍另外一种思路
#先创建一个二维散点图,然后用点的大小来代表第三个变量的值
#范例一
attach(mtcars)
r <- sqrt(disp/pi) #pi=3.1415926
#x,y坐标上画图(圆圈,方形图,星形图,温度计图,箱线图)
#circle,对应第三个变量,表示圆圈半径
#inches,比例因子,控制着圆圈大小
symbols(wt,mpg,circle=r,inches=0.30,
fg="white",bg="lightblue",
main="Bubble Plot with point size proportional to displacement",
ylab="Miles Per Gallon",
xlab="Weight of Car (lbs/1000)")
text(wt,mpg,rownames(mtcars),cex=0.6) #在指定坐标位置,进行文本标注
detach(mtcars)
#折线图
#如果将散点图的点从左往右连接起来,就会得到一个折现图
#折现图是刻画变动的优秀工具
#范例一
opar <- par(no.readonly = TRUE)
par(mfrow=c(1,2))
t1 <- subset(Orange,Tree==1)# 根据条件过滤,选出满足条件的包含全部列的子集
plot(t1$age,t1$circumference,
xlab="Age (days)",
ylab="Circumference (mm)",
main="Orange Tree 1 Growth")
plot(t1$age,t1$circumference,
xlab="Age (days)",
ylab="Circumference (mm)",
main="Orange Tree 1 Growth",
type="b") #type="b",点线图
par(opar)
#折线图
#方法一:plot(x,y,type=)
#type="p",生成典型的散点图,只有点
#type="l",生成典型的散点图,只有线
#type="o",生成常见的散点图,包含线直接串联所有点
#type="b",生成常见的散点图,包含点(可显示),线,线在点处中断
#type="c",生成典型的散点图, 包含点(空白),线,线在点空白处中断
#type="s",生成典型的散点图,阶梯线,先横着划线,然后竖着画线
#type="S",生成典型的散点图,阶梯线,先竖着画线,然后横着划线
#type="h",生成典型的散点图,直方图式的散点图
#type="n",不生成任何点和线,通常用来为后面的命令创建坐标轴
#方法二:lines(x,y,type=)
#结论:
#plot()函数是在被调用时创建一幅新图
#lines()函数是在已存在的图形上添加信息,并不能自己生成图形
#范例
class(Orange$Tree) #反馈"ordered" "factor"
Orange$Tree <- as.numeric(Orange$Tree) #将原始因子变量强制转换成数值型
ntrees <- max(Orange$Tree) #返回当前列中最大值
xrange <- range(Orange$age) #返回当前列中min,max
yrange <- range(Orange$circumference)#返回当前列中min,max
plot(xrange,yrange,type="n",
xlab="Age (days)",
ylab="Circumference (mm)"
)#画空图,仅包含纵横坐标的刻度线,以及纵横坐标的标题
colors <- rainbow(ntrees) #基于树的种类,生成对应彩虹型的颜色向量
linetype <- c(1:ntrees) #基于树的种类,生成对应线条类型的类型向量
plotchar <- seq(18,18+ntrees,1) #基于树的种类,生成对应图标类型的符号向量
for(i in 1:ntrees){
tree <- subset(Orange,Tree==i)
lines(tree$age,tree$circumference,
type="b",
lwd=2,
lty=linetype[i],
col=colors[i],
pch=plotchar[i]
)
}#为每一个树的age,circumference(周长),增加折线图,对应编号的颜色向量,类型向量,符号向量
title("Tree Growth","example of line plot")
legend(xrange[1],yrange[2],
1:ntrees,cex=0.8,
col=colors,pch=plotchar,
lty=linetype,title="Tree"
)
#在位置x最小值,y最大值处,添加图例
#1,colors[1],plotchar[1],linetype[1],对应Tree=1的树
#相关图
#范例一
options(digits=2) #针对全局设置保留小数点后两位数
cor(mtcars) #得到相关系数矩阵
library(corrgram)
#corrgram(x,order=,panel=,text.panel=,diag.panel=)
#x是一行一个观测的数据框,宽表格
#order=TRUE,相关矩阵将使用主成分分析法来对变量重排序,使得二元变量的关系模式更为明显
#上三角,下三角数据相同,且基于对角线对称
#lower.panle 设置下三角图形类型
#upper.panle 设置上三角图形类型
#控制非主对角参数设置 lower.panel,upper.panel
#panel.pie 用饼图的填充比来来表示相关性大小
#panel.shade 用阴影的深度来表示相关性大小
#panel.ellipse 画一个置信椭圆和平滑曲线
#panel.pts 画一个散点图
#panel.conf 画一个相关性及置信区间
#NULL 表示为空,留白
#控制主对角参数设置text.panel,diag.panel
#panel.txt 输出变量名
#panel.minmax 输出变量的最大值最小值和变量名
#panel.density 输出核密度曲线和变量名
corrgram(mtcars,order=TRUE,lower.panel=panel.shade,
upper.panel=panel.pie,text.panel=panel.txt,
main="Corrgram of mtcars intercorrelations")
#读图
#左下角的单元格,在主对角线下方的单元格
#蓝色的和从左下指向右上的斜杠表示单元格中的两个变量呈正相关,斜率为正
#红色的和从右上斜下的斜杠表示单元格的两个变量呈负相关,斜率为负
#色彩越深,饱和度越高,说明变量相关性越大
#相关性接近于0的单元格基本无色
#三上角的饼图也展示了相同的信息
#相关性大小由被填充的饼图块的大小来展示
#正相关性从12点钟开始顺时针填充饼图
#负相关性从12点钟开始逆时针填充饼图
#范例二
library(corrgram)
corrgram(mtcars,order=TRUE,lower.panel = panel.ellipse,
upper.panel = panel.pts,
text.panel = panel.txt,
diag.panel = panel.minmax,
main="Corrgram of mtcars data using scatter plots and ellipses")
#范例三
library(corrgram)
#上三角区域留白
#变量按照初始顺序排列
corrgram(mtcars,lower.panel=panel.shade,
upper.panel=NULL,
text.panel=panel.txt,
main="Car Mileage Data (unsorted)")
#自定义调色板
n <- 1000
mycolors <- colorRampPalette(c("blue", "orangeRed"))(n) #自定义一个颜色系列
barplot(rep(1,times=n),col=mycolors,border=mycolors,axes=FALSE)
box()
#范例四
library(corrgram)
#自定义调色板
colors() #返回所有R中预定义的颜色变量
cols <- colorRampPalette(c("darkgoldenrod4","burlywood1","darkkhaki","darkgreen"))
#传入颜色系列
corrgram(mtcars,order=TRUE,col.regions=cols,
lower.panel=panel.shade,
upper.panel=panel.conf,
text.panel=panel.txt,
main="A Corrgram (or Horse) of a Different Color")
#马赛克图 mosaic plot
#嵌套矩形面积正比于单元格频率,其中该频率即多维列联表中的频率
#颜色或阴影可表示拟合模型的残差值
#两个以上类别型变量
#范例一
td <- ftable(Titanic)
class(td) #返回"ftable"
td <- as.data.frame(td) #将ftable类型强制转换成data.frame类型
t1 <-aggregate(td$Freq,by=list(td$Sex),FUN=sum) #prop.table(t1)会报错
t2 <-with(td,table(Sex))
prop.table(t2)
library(grid)
library(vcd)
mosaic(Titanic,shade=TRUE,legend=TRUE)
#排列顺序
#class 左
#sex 上
#age 右
#survived 下
#shade=TRUE,将根据拟合模型的皮尔逊残差值对图形上色
#legned=TRUE,展示残差的图例
mosaic(~Class+Sex+Age+Survived,data=Titanic,shade=TRUE,legend=TRUE)
#马赛克读图
#用切豆腐块的方式解读
#假设生存率与船舱等级,性别和年龄无关的条件下
#蓝色阴影表示,该类别的生存率通常超过预期值,存活率高
#红色阴影表示,该类别的生存率通常低于预期值,存活率低
#1:从船员到头等舱,存活率陡然提高
#2:大部分孩子都处于三等舱和二等舱中
#3:在头等舱中的大部分女性都存活下来,而三等舱中仅有一半女性存活
#4:船员中女性很少,导致该组的Survived标签重叠
#1.在这次事件中,当灾难发生的时候,人们倾向于保护妇女和儿童,所以我们可以看到,妇女存活着的比例要远远高于男性。
#2.是不是富有的人在灾难发生的时候有优先权呢?根据我们构建的图标,答案是的。
#不管是男性还是女性,头等舱中的存活率要高于次等舱和低等舱
#3.船员是不是都在关键的时刻会保护你呢?这个结论可能有待商榷,但是我从我们上面构建的图标可以看到。
#在四中身份(头等,次等,低等,船员)中船员的存活了是排在第二位的。(我们可以理解有些船员,带着有钱人跑了。)
#4.当然还有跟多的理解,如果读者看过泰坦尼克号的话,在读这幅图的时候应该会觉的很有意思。