可视化前三步走:数据类型,分析目的,实现工具
2.1 类别数据可视化
显示各类别的绝对频数及百分比等
条形图、饼图等
2.1.1 条形图及其变种
垂直条形图:类别在x轴
水平条形图:类别在y轴
简单条形图,并列条形图 堆叠条形图
1. 简单条形图 帕累托图
- 绘制简单条形图
layout:设置页面布局
barplot:绘条形图
参数
xlab:x轴图例
ylab:y轴图例
horize:TURE水平,指水平or垂直放置条条
density:条内的线线填充密度
angle:条内线的角度
col:颜色
border:边框颜色
main:标题
- 例:不同社区、性别和态度的被调查者人数的简单条形图
attach(example2_1) #绑定数据框
table1<-table(社区)
table2<-table(性别)
table3<-table(态度) #生成频数表
layout(matrix(c(1,2,3,3),2,2,byrow=TRUE))#页面布局
par(mai=c(0.6,0.6,0.3,0.1),cex=0.7,cex.main=1,font.main=1)
#设置图形边距和字体大小
#绘制性别的条形图
barplot(table2,xlab="人数",ylab="性别",
horiz=TRUE,#水平放置
density=30,angle=0,#填充密度和密度线角度设置
col=c("grey50","grey80"),border="black", #颜色向量
main="(a)水平条形图")#标题
barplot(table3,xlab="态度",ylab="人数",
density=20,angle=90,col=c("red","blue"),
border=c(2,4),main="(b)垂直条形图")
barplot(table1,xlab="社区",ylab="人数",
cex.names=1.2,cex.lab=1.2,#字体变大
col=c("#FC8D62","#E78AC3","#66C2A5","#FFD92F")
,main="(c)垂直条形图")
- 帕累托图:按各类别的频数多少排序后的条形图,能轻松看出哪类频数出现的得多/少
例:
sort:排序
text:加标签
par:加线
plot:折线
axis:加坐标
mtext:加坐标轴标签
par(mai=c(0.7,0.7,0.2,0.7),cex=0.7)
x<-sort(table(example2_1$社区),decreasing=TRUE)#生成一维表并将频数降序排列
palette<-RColorBrewer::brewer.pal(4,"Blues")#设置调色板
bar<-barplot(x,xlab="社区",ylab="频数",col=rainbow(4),ylim=c(0,1.2*max(x)))
#条形图
text(bar,x,labels=x,pos=3,col="black")#为条形图添加频数标签
y<-cumsum(x)/sum(x)#计算累计频数
par(new=T)#绘制一新图加在现有图上
plot(y,type="b",pch=15,axes=FALSE,xlab='',ylab='',main='')
#绘制累积频数折线
axis(side=4)#在第四个边增加坐标
mtext("累计频率",side=4,line=3,cex=0.8)#添加坐标轴标签
text(labels="累积分布曲线",x=3,y=0.92,cex=1)#添加注释文本
2. 复式条形图和脊形图
- 二维列联表绘图:并列条形图或堆叠条形图
在并列条形图中,一个类别变量作为坐标轴,另一个类别变量各类别频数的条形并列摆放
在堆叠条形图中,一个类别变量作为坐标轴,另一个类别变量各类别的频数按比例堆叠在同一个条中
- 作图与一维差异不大,制作列联表时table内放两个变量即可
BarText:添加频数标签
barplot中参数
beside:挨一起TRUE
legend=rownames():添加条形图例
args.legend=list(x= ,y= , ncol= ,cex= ,bos.col=" "):图例大小颜色修饰
(p41书上b3b4定义代码有两处bug,照着打debug好久才发现qwq)
tab1<-table(性别,社区)
tab2<-table(性别,态度)
tab3<-table(社区,态度)
library(DescTools)
par(mfrow=c(2,2),mai=c(0.55,0.6,0.6,0.1),cex=0.7,cex.main=1,font.main=1)
b1<-barplot(tab1,beside=TRUE,xlab="社区",ylab="人数",
main ="(a)垂直并列",col=c("#66C2A5","#FC8D62"),
legend=rownames(tab1),
args.legend=list(x=12,y=19,ncol=2,cex=0.7,box.col ="grey80"))
BarText(tab1,b =b1, beside = TRUE , cex =1, top = TRUE )#添加频数标签
b2<- barplot (tab2, beside = TRUE , horiz =TRUE ,
xlab ="人数", ylab="态度",
main="(b)水平并列",
col = c("#66C2A5","#FC8D62"),
legend = rownames(tab2),
args.legend=list(x =9.2, y =7, ncol =2, cex =0.7,box.col ="grey80"))
BarText (tab2, b =b2, beside = TRUE , horiz = TRUE , cex =1, top = FALSE )
b3<-barplot (tab3,xlab ="态度", ylab ="人数",
main ="(c)垂直堆叠",
col = c ("#FC8D62","#E78AC3","#66C2A5","#FFD92F"),
legend=rownames (tab3),
args.legend =list(x =1.32, y =50, ncol =2, cex =0.7, box.col ="grey80"))
BarText (tab3, b=b3, cex =1)
b4<- barplot (tab3, horiz = TRUE , xlab ="人数", ylab ="态度",
main ="(d)水平堆叠",
col=c("#FC8D62","#E78AC3","#66C2A5","#FFD92F"),
legend = rownames (tab3),
args.legend =list(x =47, y =2.8, ncol =4, cex =0.7, box.col ="grey80"))
BarText (tab3, b =b4, horiz = TRUE , col ="black", cex =1)
- 脊形图:根据各类别比例绘制得条形图。将某个类别各条的高度设定为1,条的宽度与样本量成正比
spineplot:绘制脊形图
tab4<-table(社区,性别)
tab5<-table(态度,社区)
par(mfrow=c(1,2),mai=c(0.6,0.6,0.4,0.4),cex=0.7,cex.main=1,font.main=1)
palette<-rev(RColorBrewer::brewer.pal(4,"Reds"))#设置调色板
spineplot(tab4,data=example2_1,col=palette[1:2],xlab="社区",ylab="性别",main="(a)性别与社区")
spineplot(tab5,data=example2_1,col=palette,xlab="态度",ylab="社区",main="(b)社区与态度")
3. 马赛克图
两个以上变量使用,嵌套矩形面积与列联表相应单元的频数成正比
mosaicplot:绘制马赛克图
mosaic:vcd包 同上
strucplot:vcd包 同上
PlotMosaic:DescTools包 同上
geom_mosaic:ggmosaic包 同上
mosaicplot(~性别+社区+态度,
data=example2_1,
col=c("#E41A1c","#377EB8"),
cex.axis=0.8,off=5,main="")
2.1.2饼图及其变种
1. 饼图 扇形图
pie:绘制饼图
plotrix::pie3D:3D饼图
par(mfrow=c(1,2),mai=c(0.1,0.4,0.1,0.4),cex=0.7)
tab<-table(example2_1$社区) #生成频数表
name<-names(tab) #设置名称向量
percent<-prop.table(tab)*100#计算百分比
labs<-paste(name," ",percent,"%",sep="")#设置标签向量
pie(tab,labels=labs,init.angle = 90,radius=1,main="(a)普通饼图")
plotrix::pie3D(tab,labels=labs,explode=0.1,labelcex=0.7,main="(b) 3D饼图")
扇形图是看角度不是看面积
fan.plot:绘制扇形图
library(plotrix)
library(RColorBrewer)
tab<-table(example2_1$社区)
name<-names(tab)
percent<-prop.table(tab)*100
labs<-paste(name," ",percent,"%",sep="")
fan.plot(tab,labels=labs,
max.span=0.9*pi, #设置扇形最大跨度
shrink=0.06,radius=1.2,#设置扇形错开的距离和半径
label.radius=1.4,ticks=200,#设置标签与扇形的距离
col=c("#FB8072","#FFFFB3","deepskyblue","pink"))#设置颜色向量
2. 环形图 饼环图
饼图挖个圈圈
饼环图能展示双层结构
ggDount:ggiraphExtra包 绘制环形图
ggPieDount:ggiraphExtra包 绘制饼环图
library(ggiraphExtra)
require(ggplot2) #require和library一样
library(gridExtra)
p1<-ggDonut(example2_1,aes(donuts=社区),colour="white",xmin=2,xmax=4,title="(a)环形图")
p2<-ggPieDonut(data=example2_1,aes(pies=社区,donuts=态度),title="(b)饼环图")
grid.arrange(p1,p2,ncol=2) #按两列组合两张图
2.2数据分布可视化
直方图、核密度图、箱线图、小提琴图、茎叶图、点图
2.2.1 直方图 核密度图
1. 直方图
hist:直方图绘制
- hist中参数
breaks:设置数组
probability:默认FALSE,TRUE为绘制纵轴为密度的直方图
labels:TRUE为直方图增加频数或密度
lines(density(x)):为直方图增加核密度估计曲线
curve(dnorm(x,mean(x),sd(x))):为直方图增加均值为mean,标准差为sd的正态曲线
rug(x):画出x在坐标轴上位置
jitter(x):计算x的各扰动点
example2_2<-read.csv("example2_2.csv")
attach(example2_2)
par(mfrow=c(2,3),mai=c(0.4,0.5,0.4,0.1),cex=0.7,font.main=1)
hist(北京,labels=TRUE,col="#FFD92F",xlab="AQI",ylab="频数",ylim=c(0,90),main="(a)北京:添加频数标签")
hist(上海,breaks=20,col="skyblue",xlab="AQI",ylab="频数",main="(b)上海:数据分成20组")
hist(郑州,breaks=20,col="lightgreen",xlab="AQI",ylab="频数",main="(c)郑州:添加地毯图")
rug(郑州)#添加地毯图
hist(武汉,breaks=20,col="#FC8D62",xlab="AQI",ylab="频数",main="(d)武汉:添加扰动点")
rug(jitter(武汉))#添加扰动点
hist(西安,prob=TRUE,breaks=20,col="pink",xlab="AQI",ylab="密度",ylim=c(0,0.012),main="(e)西安:添加核密度曲线")
lines(density(西安),col="blue3",lwd=1)#添加核密度曲线
hist(沈阳,prob=TRUE,breaks=20,col="orange",xlab="AQI",ylab="密度",main="(f)沈阳:添加理论正态分布曲线")
curve(dnorm(x,mean(沈阳),sd(沈阳)),col="blue",add=TRUE)#添加正态分布曲线
b是指定分成20组绘制的直方图
c添加地毯图以观察实际数据在坐标轴上的分布
d计算数据扰动点,避免相同数据点在坐标轴上的重叠
e加的核密度曲线是以实际数据分布密度的估计,显示数据分布的形状
f添加理论正态分布曲线,与直方图比较可判断是否近似服从正态分布
2. 核密度图
直方图是粗略估计,核密度图是较为精准的估计(平滑曲线)
核密度曲线平滑程度取决于带宽bw,bw越大越平滑
- 可绘制核密度曲线的函数
sm.density.compare:sm包
density:psych包
densityplot:lattice包
geom_density:ggplot2包
histogram.ade:epade包
PlotMultiDens:DescTools包
- 带宽对核密度曲线的影响
d<-example2_2$北京
par(mfrow=c(1,3),mai=c(0.6,0.6,0.3,0.1),cex=0.7,cex.main=1,font.main=1)
d1<-density(d)
d2<-density(d,bw=3)
d3<-density(d,bw=10)
plot(d1,xlab="AQI",ylab="Density",main="(a)默认带宽")
plot(d2,col="red",xlab="AQI",ylab="Density",main="(b)bw=3")
polygon(d2,col="orange",border = "black")#填充橙色
plot(d3,col="red",xlab="AQI",ylab="Density",main="(c)bw=10")
polygon(d3,col="orange",border = "black")#填充
将六个核密度曲线放在一起,可以比较分布程度及偏斜程度
library(reshape2)
library(DescTools)
df<-melt(example2_2,id.vars=c("日期"),variable.name="城市",value.name="AQI")#将数据融合成长格式
par(mfrow=c(2,1),mai=c(0.6,0.6,0.3,0.1),cex=0.7,font.main=1)
PlotMultiDens(data=df,AQI~城市,col=Pal(),xlab="AQI",ylab="Density",xlim=c(-1,400),lwd=1,main="(a)核密度曲线")
PlotMultiDens(data=df,AQI~城市,xlab="AQI",ylab="Density",xlim=c(-1,400),fill=SetAlpha(rainbow(6),0.2),main="(b)填充颜色")
2.2.2 箱线图和小提琴图
用于比较多个变量或多个样本的分布
1. 箱线图
展示分布是否对称,是否存在离群点
- 找中位数(median)和两个四分位数(quartiles),画箱子
- 计算内围栏,并画出须线。
内围栏(inter fence)是与四分位数的距离等于1.5倍四分位差的两个点,
其中
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)