第三章 类别数据可视化

Author

221527110陈艺印

1 解释原始数据

  • Titanic数据集是datasets包的配套案例数据,可以通过as.data.frame将其转化为数据框。解析数据包含哪些变量,如果是分类变量分别有哪些类别?
data = as.data.frame(Titanic)
DT::datatable(data,rownames = FALSE)

2 条形图

绘制Sex和 Survived的并列条形图和堆叠条形图,并为条形图添加频数标签。

2.1 数据准备

  • 下面代码作了什么数据处理?为什么要这样处理?
  • 答:从data数据框中选择Sex、Survived和Freq三列 使用summarise()按Sex和Survived分组,计算每组的Freq总和(命名为”n”) 将列名重命名为中文:“性别”、“生还”和”人数”
# 数据准备
df <- data %>% select(Sex,Survived,Freq) %>% 
  summarise(n=sum(Freq),.by=c(Sex,Survived)) %>% 
  rename(性别=Sex,生还=Survived,人数=n)
  

DT::datatable(df,rownames = FALSE)

2.2 利用geom_col函数作图

# 图(a)垂直并列条形图
p1<-ggplot(df,aes(x=性别,y=人数,fill=生还))+
  geom_col(width=0.8,    # 设置条形宽度
  position="dodge",      # 绘制并列条形图
  color="gray50")+       # 设置条形图的边框颜色
  scale_fill_brewer(palette="Set2")+  # 设置填充颜色
  geom_text(aes(label=人数),position=position_dodge(0.9),vjust=-0.5,size=3)+          # 设置标签垂直位置和字体大小
  ylim(0,1.1*max(df$人数))+      # 设置y轴范围
  ggtitle("(a) 垂直并列条形图")

# 图(b) 水平并列条形图
p2<-ggplot(df,aes(x=性别,y=人数,fill=生还))+
  geom_col(width=0.7,color="gray50")+ # 绘制堆叠条形图(默认)
  geom_text(aes(label=人数),position=position_stack(0.5),size=3)+
  scale_fill_brewer(palette="Set2")+
  ggtitle("(b) 垂直堆叠条形图")

grid.arrange(p1,p2,ncol=2)           # 按2列组合图形

  • 你可以通过修改数据或者修改刻度标签将图中性别和生还的类别标签改为中文,请给出代码完成修改。
# 图(a)垂直并列条形图
p1<-ggplot(df,aes(x=性别,y=人数,fill=生还))+
  geom_col(width=0.8,    # 设置条形宽度
  position="dodge",      # 绘制并列条形图
  color="gray50")+       # 设置条形图的边框颜色
  scale_fill_brewer(palette="Set2")+  # 设置填充颜色
  geom_text(aes(label=人数),position=position_dodge(0.9),vjust=-0.5,size=3)+          # 设置标签垂直位置和字体大小
  ylim(0,1.1*max(df$人数))+      # 设置y轴范围
  ggtitle("(a) 垂直并列条形图")+
  scale_x_discrete(
    "性别",
    labels = c( "男","女")
  )+
  scale_fill_discrete(
    "生还",
    labels = c( "否","是")
  )

# 图(b) 水平并列条形图
p2<-ggplot(df,aes(x=性别,y=人数,fill=生还))+
  geom_col(width=0.7,color="gray50")+ # 绘制堆叠条形图(默认)
  geom_text(aes(label=人数),position=position_stack(0.5),size=3)+
  scale_fill_brewer(palette="Set2")+
  ggtitle("(b) 垂直堆叠条形图")+
  scale_x_discrete(
    "性别",
    labels = c( "男","女")
  )+
  scale_fill_discrete(
    "生还",
    labels = c( "否","是")
  )

grid.arrange(p1,p2,ncol=2)           # 按2列组合图形

2.3 介绍图形特点和信息

  • 垂直并列条形图通过横向对比数据,便于显示垂直堆叠条形图通过纵向对比数据,同时显示部分与整体的关系;如图所示,都可明显看出两种性别的存活人数相近,但女性存活率明显高于男性。

3 帕累托图

绘制Class 的帕累托图。

3.1 数据准备

df<-data |> 
  select(Class,Freq) |> 
  summarise(n=sum(Freq),.by=Class) |> 
  rename(乘客舱位=Class,人数=n ) |> 
  arrange(desc(人数)) |> 
  mutate(累积百分比 = cumsum(人数*100/sum(人数)), #计算累积百分比
         累积百分比 = round(累积百分比,1),        #保留一位小数 
         乘客舱位 = fct_inorder(乘客舱位)         #按字符出现顺序定义因子水平
         )

datatable(df,rownames = FALSE)

3.2 利用geom_col()+geom_line()+geom_point()等函数作图

palette<-rev(brewer.pal(4,"Reds"))        # 设置调色板
# 绘制条形图
p<-ggplot(df)+aes(x=乘客舱位,y=人数)+                
  geom_col(width=0.8,fill=palette,color="grey50")+# 绘制条形图
  scale_x_discrete(labels=c("食品烟酒","衣着","居住","生活用品\n及服务","交通通信","教育文化\n娱乐","医疗保健","其他用品\n及服务"))+ # 将x轴的长标签折行
  geom_text(aes(x=乘客舱位,y=人数,label=人数,vjust=-0.5),size=3,color="gray50")+                      # 添加数值标签,垂直调整标签位置
   ylab("人数\n(个)")+               # 设置y轴标签 
  theme(axis.text.y=element_text(angle=90,hjust=0.5,vjust=0.5))+     # 调整y轴标签角度
  theme(legend.position="none")         # 删除图例

# 绘制折线和点
p1<-p+geom_line(aes(x=as.numeric(乘客舱位),y=累积百分比*max(人数/100)))+     # 绘制累积百分比曲线
  geom_point(aes(x=as.numeric(乘客舱位),y=累积百分比*max(人数/100)),
             size=2.5,shape=23,fill="white")+                     # 绘制点
  geom_text(aes(label=累积百分比,x=乘客舱位,y=1*累积百分比*max(人数/100),
    hjust=0.6,vjust=-0.95),size=3,colour="blue3")+                # 添加百分比数值标签
  scale_y_continuous(sec.axis = sec_axis(~./max(df$人数/100)))# 添加坐标轴
p1+annotate("text",x=4.5,y=800,label="百分比(%)",angle=90,size=3.5)+
   annotate("text",x=3,y=700,label="累积百分比曲线",size=3.5)   # 添加注释文本

3.3 介绍图形特点和信息

  • 这是堆积柱状图与累积百分比曲线结合的图。横坐标为金额,纵轴左侧是累积百分比,右侧是乘客舱位类别。柱状图显示食品烟酒占比最大,累积百分比曲线体现食品烟酒对累积占比贡献大,后续类别贡献渐小 。

4 脊形图

绘制Class和 Survived 的脊形图。

4.1 数据准备

# 数据处理
df<- data |> select(Class,Survived,Freq) %>%
  summarise(n=sum(Freq),.by=c("Class","Survived"))  %>%
  mutate(percent=n*100/sum(n),.by=Survived) 

datatable(df,rownames = FALSE)

4.2 利用geom_col() 作图

ggplot(df)+aes(x=Survived,y=percent,fill=Class)+ylab("百分比(%)")+
  geom_col(width=0.8,color="grey50")+
  scale_fill_brewer(palette="Blues")

4.3 利用ggiraphExtra包ggSpine()

df1<-df %>% mutate(
  Class=factor(Class,levels = c("Crew","3rd","2nd","1st"))
)
ggSpine(data=df1,aes(x=Survived,y=percent,fill=Class),stat = "identity",
  palette="Blues",labelsize=3,reverse=TRUE)  # 反转调色板颜色

4.4 介绍图形特点和信息

  • 以柱子表示数据,不同类别用不同颜色在柱子内堆叠。可直观看出各部分占总体比例,以及不同类别间数量对比。适合呈现数据在不同分组下各部分的分布情况。

  • 从占比看,在未存活(No)组中,Crew 占比最大;存活(Yes)组中,1st 占比相对突出。整体反映出不同类别在存活和未存活情况上的占比差异,暗示不同身份在生存结果上存在明显区别 。

5 树状图和旭日图

绘制Class、Sex、Age和Survived4个变量的矩形树状图和旭日图

5.1 利用treemap::treemap()函数作树状图

treemap(data,index=c("Class","Sex","Age","Survived"),  # 设置聚合索引的列名称
  vSize="Freq",                                  # 指定矩形大小的列名称
  #fontsize.labels=9,                             # 设置标签字体大小
  position.legend="bottom",                      # 设置图例位置
  title="(a) 分层顺序:Class-Sex-Age-Survived")

5.2 利用sunburstR::sunburst() 函数作旭日图

  • 通过d3r::d3_nest将数据框转化为层次数据“d3.js”作为绘图输入
df<-data%>%select(Class,Sex,Age,Survived)  # 根据需要调整列变量的位置
df_tree<-d3_nest(df,value_cols="Survived")  
datatable(df,rownames = FALSE)
sunburst(data=df_tree,           # 绘制旭日图
   valueField="Survived") 
Legend

5.3 介绍图形特点和信息

答:矩形树状图以矩形嵌套展示层级结构数据 ,通过矩形面积大小体现数据占比关系。能直观呈现同级数据对比 ,便于发现数值差异。空间利用率高,无多余空白 ,可展示大量分层数据。

旭日图用嵌套圆环展示层次结构 ,离圆心近层级高,清晰呈现层级与归属关系。圆环分割成扇形表示数据部分 ,扇形大小体现占比,直观展现比例关系。

6 热图和南丁格尔玫瑰图

绘制Class和Survived 的点阵图、热图和南丁格尔玫瑰图。

6.1 数据准备

df<-data%>%ftable()%>%
  as.data.frame()%>%
  rename(人数=Freq)  

data_prepared <- data %>%
  group_by(Class, Survived) %>%
  summarise(Freq = sum(Freq), .groups = 'drop') %>%
  mutate(
    # 计算百分比(按舱位分层)
    Percent = round(Freq / sum(Freq) * 100, 1),
    # 生成标签列(用于图形中的分类显示)
    Label = paste(Class, Survived, sep = " | ")
  )

6.2 利用ggiraphExtra::ggHeatmap()作热力图

分别作矩形热图和极坐标热图

p1<-ggHeatmap(data,aes(x = Class,y=Survived,fill = Freq),
   addlabel=TRUE,palette="Blues",
   color = "white",interactive = FALSE)+               
   ggtitle("矩形热图")
 
p2<-ggHeatmap(data,aes(x=Class,y=Survived,fill = Freq),polar=TRUE,
   addlabel=TRUE,palette="Blues")+
   ggtitle("极坐标热图")


grid.arrange(p1,p2,ncol=2)   

6.3 利用ggiraphExtra::ggRose() 作玫瑰图

df<-data|> summarise(n=sum(Freq),.by=c("Class","Survived"))
datatable(df)
ggRose(df,aes(x=Class,y=n,fill=Survived),
  stat="identity",palette="Reds",reverse=TRUE)+ylab("Survived")+
  guides(fill=guide_legend(nrow=2,title=NULL))+  # 图例排成2行,去掉图例标题
  theme(legend.position="bottom")+
  theme(plot.title=element_text(size=10))+       # 设置标题字体大小
  theme(axis.text.x=element_text(size=8,color="red3",angle=45))+ # 设置坐标轴标签字体大小和角度
  ggtitle("x轴为舱位类型")

6.4 介绍图形特点和信息

  • 矩形热图以二维矩形布局呈现 ,通过不同颜色及深浅代表数据值大小,行列对应不同变量,可对行列聚类,使相似模式聚集 。展示 “Survived” 和 “Class” 两个变量关系 ,颜色深浅反映 “Freq” 大小,能看出不同类别存活与未存活的频数差异 。

  • 极坐标热图是热图扩展形式 ,将数据信息以色块拼成环形展示 ,用颜色深浅表示数据分布 。样展示 “Survived” 和 “Class” 关系 ,通过环形色块颜色深浅体现 “Freq” ,可直观比较不同类别在存活和未存活状态下的频数情况 。

  • 玫瑰图形似玫瑰,以极坐标形式呈现 ,由多个扇形组成环形。通过扇形半径长度或面积大小表示数据数值 ,角度可表示类别等信息;能在一个平面内多角度展现数据 。直观比较不同类别数据大小 ,半径长或面积大的扇形代表对应数据数值大。图中展示了不同舱位类型(Class )在存活(Survived 为 Yes )和未存活(Survived 为 No )状态下的数据对比 ,可看出不同舱位存活情况差异 。

7 饼环图

绘制Class和 Sex的饼环图。

7.1 数据准备

df<-data|> summarise(n=sum(Freq),.by=c("Class","Sex"))
datatable(df)
df
  Class    Sex   n
1   1st   Male 180
2   2nd   Male 179
3   3rd   Male 510
4  Crew   Male 862
5   1st Female 145
6   2nd Female 106
7   3rd Female 196
8  Crew Female  23

7.2 利用ggiraphExtra::ggPieDonut()作饼环图

p1<-ggPieDonut(data = df,aes(pies = Class, donuts = Sex, count = n),
  title="(a) 舱位为饼图,性别为环形图") 

p1

7.3 介绍图形特点和信息

  • 饼环图结合了饼图和环形图特点 ,由内部饼图和外部环形图构成。通过扇形角度划分展示各部分占总体比例 ,直观呈现数据构成。可同时展示不同类别数据 ,便于对比各部分占比差异。图中内部饼图展示不同舱位(Crew、1st、2nd、3rd )占比 ,其中 Crew 占比最大为 40.2% 。外部环形图展示各舱位中男(Male )女(Female )性别占比情况 ,能看出不同舱位男女比例差异 。 帮助了解不同舱位构成及舱位内性别分布