目录
一 气球图和热图
1.气球图
2.热图
二 南丁格尔玫瑰图
三 金字塔图
四 饼图及其变种
1.饼图
2.扇形图
3.环形图
一 气球图和热图
1.气球图
气球图是用气球大小表示数据的图形,它画出的是一个图形矩阵,其中每个单元格包含一个点(气球),其大小与相应数据的大小成比例
气球图可用于展示由两个类别变量生成的二维列联表,也可以用于展示具有行名和列名称的其他数据
绘图的数据形式是一个数据框或矩阵,数据框中包含至少三列,第1列对应第1个类别变量,第2列对应第2个类别变量,第3列是两个类别变量对应的频数或其他数值
满意度 不满意 满意 中立
性别 网购次数
男 1~2次 117 57 106
3~5次 137 54 131
6次以上 106 49 83
女 1~2次 122 114 102
3~5次 179 141 162
6次以上 139 105 96
df<-as.data.frame(tab) # 将列联表转化成数据框
head(df) # 查看前6行
性别 网购次数 满意度 Freq
1 男 1~2次 不满意 117
2 女 1~2次 不满意 122
3 男 3~5次 不满意 137
4 女 3~5次 不满意 179
5 男 6次以上 不满意 106
6 女 6次以上 不满意 139
#满意度、网购次数的气球图
my_cols<-c("#0D0887FF","#6A00A8FF","#B12A90FF","#E16462FF","#FCA636FF","#F0F921FF")
# 设置颜色向量
ggballoonplot(df,x="满意度",y="网购次数", # 设置图形的x轴和y轴
shape=21, # 设置气球形状,默认21,可选22,23,24,25
size="Freq",fill="Freq", # 设置点的大小和填充颜色
rotate.x.text=FALSE, # x轴文本标签不旋转
ggtheme=scale_fill_gradientn(colors=my_cols)) # 设置渐变颜色
# 按性别分面的满意度与网购次数的气球图
palette<-rev(brewer.pal(11,"RdYlGn")) # 设置调色板
ggballoonplot(df,x="满意度",y="网购次数",
size="Freq",fill="Freq",
facet.by=c("性别"), # 按性别分面
rotate.x.text=FALSE, # x轴文本标签不旋转
ggtheme=scale_fill_gradientn(colors=palette))
# 4个地区8项消费支出的气球图
library(ggpubr)
library(RColorBrewer)
data3_2<-read.csv("./mydata/chap03/data3_2.csv")
data3_2
支出项目 北京 天津 上海 重庆
1 食品烟酒 7548.9 8647.0 10005.9 5943.5
2 衣着 2238.3 1944.8 1733.4 1394.8
3 居住 12295.0 5922.4 13708.7 3140.9
4 生活用品及服务 2492.4 1655.5 1824.9 1245.5
5 交通通信 5034.0 3744.5 4057.7 2310.3
6 教育文化娱乐 3916.7 2691.5 4685.9 1993.0
7 医疗保健 2899.7 2390.0 2602.1 1471.9
8 其他用品及服务 1000.4 845.6 1173.3 398.1
mat<-as.matrix(data3_2[,2:5]);rownames(mat)=data3_2[,1]
# 将data3_2转化成矩阵
mat
北京 天津 上海 重庆
食品烟酒 7548.9 8647.0 10005.9 5943.5
衣着 2238.3 1944.8 1733.4 1394.8
居住 12295.0 5922.4 13708.7 3140.9
生活用品及服务 2492.4 1655.5 1824.9 1245.5
交通通信 5034.0 3744.5 4057.7 2310.3
教育文化娱乐 3916.7 2691.5 4685.9 1993.0
医疗保健 2899.7 2390.0 2602.1 1471.9
其他用品及服务 1000.4 845.6 1173.3 398.1
palette<-rev(brewer.pal(11,"Spectral")) # 设置调色板
ggballoonplot(mat,fill="value",
rotate.x.text=FALSE)+ # x轴文本标签不旋转
scale_fill_gradientn(colors=palette) # 使用梯度调色板
2.热图
热图是用颜色的饱和度(深浅)表示数值大小图形
可以绘制成矩形的形式,用每个矩形的颜色饱和度表示二维表中每个单元格对应的数值大小
也可以将矩形转换成极坐标,绘制出圆形的热图
# 性别、网购次数的热图
library(ggiraphExtra)
require(ggplot2)
library(gridExtra)
data3_1<-read.csv("./mydata/chap03/data3_1.csv")
# 绘制图形p1、p2
p1<-ggHeatmap(data3_1,aes(x=网购次数,y=性别), # 绘制矩形热图
addlabel=TRUE, # 添加数值标签
palette="Reds")+ # 使用红色调色板
ggtitle("(a) 矩形热图")
p2<-ggHeatmap(data3_1,aes(x=网购次数,y=性别),polar=TRUE,
addlabel=TRUE,palette="Reds")+ # 绘制极坐标热图
ggtitle("(b) 极坐标热图") # 添加标题
grid.arrange(p1,p2,ncol=2) # 按2列组合图形p1、p2
# 按性别分面的满意度和网购次数的矩形热图
ggiraphExtra::ggHeatmap(data3_1,aes(x=满意度,y=网购次数,facet=性别),
addlabel=TRUE,palette="Reds")
# 4个地区8项消费支出(元)的极坐标热图
library(ggiraphExtra)
require(ggplot2)
data3_2<-read.csv("./mydata/chap03/data3_2.csv")
data3_2
支出项目 北京 天津 上海 重庆
1 食品烟酒 7548.9 8647.0 10005.9 5943.5
2 衣着 2238.3 1944.8 1733.4 1394.8
3 居住 12295.0 5922.4 13708.7 3140.9
4 生活用品及服务 2492.4 1655.5 1824.9 1245.5
5 交通通信 5034.0 3744.5 4057.7 2310.3
6 教育文化娱乐 3916.7 2691.5 4685.9 1993.0
7 医疗保健 2899.7 2390.0 2602.1 1471.9
8 其他用品及服务 1000.4 845.6 1173.3 398.1
df<-reshape2::melt(data3_2,id.vars="支出项目",variable.name="地区",value.name="支出金额") # 融合数据
df
支出项目 地区 支出金额
1 食品烟酒 北京 7548.9
2 衣着 北京 2238.3
3 居住 北京 12295.0
4 生活用品及服务 北京 2492.4
5 交通通信 北京 5034.0
6 教育文化娱乐 北京 3916.7
7 医疗保健 北京 2899.7
8 其他用品及服务 北京 1000.4
9 食品烟酒 天津 8647.0
10 衣着 天津 1944.8
11 居住 天津 5922.4
12 生活用品及服务 天津 1655.5
13 交通通信 天津 3744.5
14 教育文化娱乐 天津 2691.5
15 医疗保健 天津 2390.0
16 其他用品及服务 天津 845.6
17 食品烟酒 上海 10005.9
18 衣着 上海 1733.4
19 居住 上海 13708.7
20 生活用品及服务 上海 1824.9
21 交通通信 上海 4057.7
22 教育文化娱乐 上海 4685.9
23 医疗保健 上海 2602.1
24 其他用品及服务 上海 1173.3
25 食品烟酒 重庆 5943.5
26 衣着 重庆 1394.8
27 居住 重庆 3140.9
28 生活用品及服务 重庆 1245.5
29 交通通信 重庆 2310.3
30 教育文化娱乐 重庆 1993.0
31 医疗保健 重庆 1471.9
32 其他用品及服务 重庆 398.1
ggHeatmap(df,aes(x=支出项目,y=地区,fill=支出金额),polar=TRUE,addlabel=TRUE,palette="Reds")
ggHeatmap(df,aes(x=支出项目,y=地区,fill=支出金额),polar=FALSE,addlabel=TRUE,palette="Reds")
二 南丁格尔玫瑰图
南丁格尔玫瑰图(Nightingale rose diagram)是在极坐标下绘制的一种条形图,又称极区图(polar area diagram)
玫瑰图由英国护士和统计学家弗罗伦斯·南丁格尔(Florence Nightingale)所发明,她自己称这类图为鸡冠花(coxcomb),用于表达战地军医院季节性的死亡率
普通的条形图是在直角坐标下绘制的,玫瑰图则是在极坐标下绘制的,它使用弧形的半径长度表示数据的大小,每个类别的数据在极坐标中用一个扇形表示,扇形的大小与类别的频数成比例
# 2017年北京人均消费支出的玫瑰图
palette<-brewer.pal(8,"Set3") # 8种颜色的离散型调色板
ggplot(data3_2,aes(x=支出项目,y=北京,fill=factor(北京)))+
geom_bar(width=1,stat="identity",colour="black",fill=palette)+# 画出条形图
geom_text(aes(y=北京,label=北京),color="grey30")+ # 添加y轴和数据标签
coord_polar(theta="x",start=0)+ # 转化成极坐标图
theme(axis.title=element_text(size=8))+ # 设置坐标轴标签字体大小
theme(axis.text.x=element_text(size=7,color="black"))#设置坐标轴刻度字体大小
# 图3-30 2017年北京、天津、上海、重庆人均消费支出的玫瑰图
library(ggiraphExtra)
library(ggplot2)
# 构建新的数据框,以使支出项目的排列顺序与原始数据框一致
data3_2<-read.csv("./mydata/chap03/data3_2.csv")
d.long<-reshape2::melt(data3_2,id.vars="支出项目",variable.name="地区",value.name="支出金额") # 将数据转化成长格式
d.long
支出项目 地区 支出金额
1 食品烟酒 北京 7548.9
2 衣着 北京 2238.3
3 居住 北京 12295.0
4 生活用品及服务 北京 2492.4
5 交通通信 北京 5034.0
6 教育文化娱乐 北京 3916.7
7 医疗保健 北京 2899.7
8 其他用品及服务 北京 1000.4
9 食品烟酒 天津 8647.0
10 衣着 天津 1944.8
11 居住 天津 5922.4
12 生活用品及服务 天津 1655.5
13 交通通信 天津 3744.5
14 教育文化娱乐 天津 2691.5
15 医疗保健 天津 2390.0
16 其他用品及服务 天津 845.6
17 食品烟酒 上海 10005.9
18 衣着 上海 1733.4
19 居住 上海 13708.7
20 生活用品及服务 上海 1824.9
21 交通通信 上海 4057.7
22 教育文化娱乐 上海 4685.9
23 医疗保健 上海 2602.1
24 其他用品及服务 上海 1173.3
25 食品烟酒 重庆 5943.5
26 衣着 重庆 1394.8
27 居住 重庆 3140.9
28 生活用品及服务 重庆 1245.5
29 交通通信 重庆 2310.3
30 教育文化娱乐 重庆 1993.0
31 医疗保健 重庆 1471.9
32 其他用品及服务 重庆 398.1
a<-c("食品烟酒","衣着","居住","生活用品及服务","交通通信","教育文化娱乐","医疗保健","其他用品及服务") # 设置因子向量
f<-factor(a,ordered=TRUE,levels=a) # 将支出项目变为有序因子
df.rose<-data.frame(支出项目=f,d.long[,2:3]) # 构建新的有序因子数据框
df.rose
支出项目 地区 支出金额
1 食品烟酒 北京 7548.9
2 衣着 北京 2238.3
3 居住 北京 12295.0
4 生活用品及服务 北京 2492.4
5 交通通信 北京 5034.0
6 教育文化娱乐 北京 3916.7
7 医疗保健 北京 2899.7
8 其他用品及服务 北京 1000.4
9 食品烟酒 天津 8647.0
10 衣着 天津 1944.8
11 居住 天津 5922.4
12 生活用品及服务 天津 1655.5
13 交通通信 天津 3744.5
14 教育文化娱乐 天津 2691.5
15 医疗保健 天津 2390.0
16 其他用品及服务 天津 845.6
17 食品烟酒 上海 10005.9
18 衣着 上海 1733.4
19 居住 上海 13708.7
20 生活用品及服务 上海 1824.9
21 交通通信 上海 4057.7
22 教育文化娱乐 上海 4685.9
23 医疗保健 上海 2602.1
24 其他用品及服务 上海 1173.3
25 食品烟酒 重庆 5943.5
26 衣着 重庆 1394.8
27 居住 重庆 3140.9
28 生活用品及服务 重庆 1245.5
29 交通通信 重庆 2310.3
30 教育文化娱乐 重庆 1993.0
31 医疗保健 重庆 1471.9
32 其他用品及服务 重庆 398.1
ggRose(df.rose,aes(x=地区,fill=支出项目,y=支出金额),stat="identity",reverse=TRUE)
# 以X轴为支出项目的玫瑰图
ggRose(df.rose,aes(x=支出项目,fill=地区,y=支出金额),
stat="identity",reverse=TRUE) # reverse=TRUE—颜色反转
三 金字塔图
金字塔图(pyramid chart)是一种特殊的塔状条形图,主要用于展示不同性别和不同年龄组的人口分布状况,因此也称为人口金字塔图( population pyramid chart)
绘制金字塔图时,通常将人口数或人口百分比作为X轴,将不同年龄组作为Y轴,不同年龄组内的人口数或百分比绘制成背靠背的条形图
金字塔图可用于展示不同年龄组中男性和女性人口的分布状况,也可以用于展示两个不同国家之间的人口年龄分布的差异,或展示不同时间点的人口年龄的分布
# 2010年(第6次人口普查)中国人口金字塔图
data3_3<-read.csv("./mydata/chap03/data3_3.csv")
data3_3
年龄组 男 女
1 0岁 7461199 6325235
2 1~4岁 33601367 28144809
3 5~9岁 38464665 32416884
4 10~14岁 40267277 34641185
5 15~19岁 51904830 47984284
6 20~24岁 64008573 63403945
7 25~29岁 50837038 50176814
8 30~34岁 49521822 47616381
9 35~39岁 60391104 57634855
10 40~44岁 63608678 61145286
11 45~49岁 53776418 51818135
12 50~54岁 40363234 38389937
13 55~59岁 41082938 40229536
14 60~64岁 29834426 28832856
15 65~69岁 20748471 20364811
16 70~74岁 16403453 16568944
17 75~79岁 11278859 12573274
18 80~84岁 5917502 7455696
19 85~89岁 2199810 3432118
20 90~94岁 530872 1047435
21 95~99岁 117716 252263
22 100岁及以上 8852 27082
library(DescTools)
par(mfrow=c(1,2),mai=c(0.8,0.7,0.2,0.2))
# 图(a)
PlotPyramid(lx=data3_3$男,rx=data3_3$女, # 设置左侧条形和右侧条形
col=c("cornflowerblue","indianred"), # 设置颜色向量
lxlab="男",rxlab="女", # 设置左侧x轴和右侧x轴的标签
ylab=data3_3[,1],ylab.x=0, # 设置y轴标签和在x轴的位置
cex.axis=0.7,cex.lab=1,cex.names=0.6,adj=0.5) # 设置坐标轴和标签的大小及位置
# 图(b)
PlotPyramid(lx=data3_3$男,rx=data3_3$女,
col=c("cornflowerblue","indianred"),
ylab=data3_3[,1],ylab.x=-80000000,
lxlab="男",rxlab="女",
gapwidth=0,space=0, # 设置左右条形间隔和上下条形间隔
cex.axis=0.7,cex.lab=1,cex.names=0.6,adj=0.5)
四 饼图及其变种
1.饼图
饼图 ( pie chart)是用圆形及圆内扇形的角度来表示数值大小的图形,它主要用于表示一个样本(或总体)中各类别的频数占总频数的百分比
# 图3-33 不同满意度人数构成的饼图
data3_1<-read.csv("./mydata/chap03/data3_1.csv")
head(data3_1)
性别 网购次数 满意度
1 女 6次以上 满意
2 男 3~5次 不满意
3 女 3~5次 不满意
4 男 3~5次 中立
5 女 1~2次 满意
6 男 6次以上 不满意
par(mfrow=c(1,2),mai=c(0.1,0.4,0.1,0.4),cex=0.7)
tab<-table(data3_1$满意度) # 生成频数表
tab
不满意 满意 中立
800 520 680
name<-names(tab) # 设置名称向量
percent<-prop.table(tab)*100 # 计算百分比
labs<-paste(name," ",percent,"%",sep="") # 设置标签向量
#绘制普通饼图
pie(tab,labels=labs,init.angle=90,radius=1,col=c("red1","green1","turquoise1"))
plotrix::pie3D(tab,labels=labs,explode=0.1,labelcex=0.7,col=c("lightgreen","pink","deepskyblue"))
# 不同网购次数和不同满意度人数构成的饼图
library(ggiraphExtra)
require(ggplot2)
library(gridExtra)
p1<-ggPie(data=data3_1,aes(pies=网购次数)) # 使用原始数据框
# 生成带有交叉频数的数据框(根据原始数据绘图时不需要)
tab<-ftable(data3_1) # 生成列联表(也可以使用table函数生成列联表)
tab
满意度 不满意 满意 中立
性别 网购次数
男 1~2次 117 57 106
3~5次 137 54 131
6次以上 106 49 83
女 1~2次 122 114 102
3~5次 179 141 162
6次以上 139 105 96
df<-as.data.frame(tab) # 将列联表转换成带有类别频数的数据框
p2<-ggPie(data=df,aes(pies=满意度,count=Freq)) # 使用带有交叉频数的数据框绘图
grid.arrange(p1,p2,ncol=2) # 按2列组合图形p1和p2
2.扇形图
扇形图(fan chart)是饼图的一个变种,它是将频数构成中百分比最大的一个绘制成一个扇形区域,而其他各类百分比按大小使用不同的半径绘制出扇形,并叠加在这个最大的扇形上。
fan.plot(tab,labels=labs,
max.span=0.9*pi, # 设置扇形图的最大跨度
shrink=0.06,radius=1.2, # 设置扇形错开的距离和半径
label.radius=1.4,ticks=200, # 设置标签与扇形的距离
col=c("deepskyblue","lightgreen","pink")) # 设置颜色向量
3.环形图
环形图( donut chart )是将饼图的中间挖掉后剩下的环形,也称为甜甜圈图
环形图可以看做是饼图的变种
# 网购次数和满意度的环形图
data3_1<-read.csv("./mydata/chap03/data3_1.csv")
p1<-ggDonut(data3_1,aes(donuts=网购次数))
p2<-ggDonut(data3_1,aes(donuts=满意度))
grid.arrange(p1,p2,ncol=2) # 按2列组合图形p1和p2
# 网购次数与满意度、满意度与性别的饼环图
p1<-ggPieDonut(data=data3_1,aes(pies=网购次数,donuts=满意度))
# 网购次数饼图与满意度环形图的结合
p2<-ggPieDonut(data=data3_1,aes(pies=满意度,donuts=性别))
# 满意度饼图与性别环形图的结合
grid.arrange(p1,p2,ncol=2) # 按2列组合图形p1和p2