R语言 类别数据可视化(2)

 目录

一 气球图和热图

1.气球图

 2.热图

二 南丁格尔玫瑰图 

三 金字塔图 

 四 饼图及其变种

1.饼图

2.扇形图

 3.环形图


一 气球图和热图

1.气球图

气球图是用气球大小表示数据的图形,它画出的是一个图形矩阵,其中每个单元格包含一个点(气球),其大小与相应数据的大小成比例

气球图可用于展示由两个类别变量生成的二维列联表,也可以用于展示具有行名和列名称的其他数据

绘图的数据形式是一个数据框或矩阵,数据框中包含至少三列,第1列对应第1个类别变量,第2列对应第2个类别变量,第3列是两个类别变量对应的频数或其他数值

library(ggpubr)
data3_1<-read.csv("./mydata/chap03/data3_1.csv")
tab<-ftable(data3_1)                        # 生成列联表
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)                      # 将列联表转化成数据框
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

  • 1
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可乐  

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值