第三章 类别数据可视化

Author

221527123丁成裕

1 解释原始数据

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

    1. Class(舱位等级):1st, 2nd, 3rd, Crew

    2. Sex(性别):Male, Female

    3. Age(年龄组):Child, Adult

    4. Survived(是否幸存):No, Yes

    1.0.1 数值变量:

    • Freq(频数):表示各分类组合的观测次数
data = as.data.frame(Titanic)
DT::datatable(data,rownames = FALSE)

2 条形图

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

2.1 数据准备

  • 下面代码作了什么数据处理?为什么要这样处理?
  • 汇总数据,知道了存活男性,存活女性,死亡女性,死亡男性的数量
# 数据准备
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轴范围
    scale_fill_discrete(
    "生还",
    labels=c("否","是"))+
  scale_x_discrete(
    "性别",
    labels=c("男","女"))+
  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")+
  ## 将图中性别和生还的类别标签改为中文
  scale_fill_discrete(
    "生还",
    labels=c("否","是"))+
  scale_x_discrete(
    "性别",
    labels=c("男","女"))+
  ggtitle("(b) 垂直堆叠条形图")

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()等函数作图

library(ggplot2)
library(tidyr)
 
# 将Titanic数据集转换为数据框
titanic_df <- as.data.frame(Titanic)
 
# 计算每个舱位等级的生存率
survival_rates <- titanic_df %>%
  group_by(Class, Survived) %>%
  summarise(Total = sum(Freq)) %>%
  pivot_wider(names_from = Survived, values_from = Total) %>%
  mutate(SurvivalRate = Yes / (Yes + No))
 
# 绘制柱状图(geom_col)和折线图(geom_line)以及点图(geom_point)
ggplot(survival_rates, aes(x = Class, y = SurvivalRate)) +
  geom_col(aes(fill = Class), alpha = 0.5) +  # 柱状图
  geom_line(aes(group = 1), color = "blue", size = 1) +  # 折线图
  geom_point(color = "red", size = 3) +  # 点图
  labs(title = "Survival Rate by Passenger Class",
       x = "Passenger Class",
       y = "Survival Rate") +
  theme_minimal()

3.3 介绍图形特点和信息

  • 图形特点

    1. 柱状图

      • 直观对比:用不同高度的柱子直接对比各舱位等级(如头等舱、二等舱等)的生存率。

      • 颜色区分:柱子颜色不同,一眼就能看出哪个舱位等级对应哪个柱子。

    2. 折线图

      • 趋势清晰:通过一条线连接各舱位等级的生存率点,清楚地展示了生存率是如何随着舱位等级变化的。
    3. 点图

      • 突出关键点:在折线图上加了红色圆点,特别强调了每个舱位等级的生存率具体是多少。

    3.3.1 图形信息

    • 生存率差异:图形直接告诉我们,不同舱位等级的乘客生存率是不一样的。柱子越高,生存率越高。

    • 生存趋势:折线图告诉我们,舱位等级越高(比如头等舱),生存率也越高;舱位等级越低(比如船员舱),生存率越低。

4 脊形图

绘制Class和 Survived 的脊形图。

4.1 数据准备

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

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

datatable(df,rownames = FALSE)

4.2 利用geom_col() 作图

p1 = ggplot(df)+aes(x=Class,y=percent,fill=Survived)+ylab("百分比(%)")+
  geom_bar(stat="identity",width=0.8,color="grey50")+
  scale_fill_brewer(palette="Blues")
p2 = ggplot(df1)+aes(x=Survived,y=percent,fill=Class)+ylab("百分比(%)")+
  geom_bar(stat="identity",width=0.8,color="grey50")+
  scale_fill_brewer(palette="Blues")
grid.arrange(p1,p2,ncol=1) 

4.3 利用ggiraphExtra包ggSpine()

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

4.4 介绍图形特点和信息

  • 死亡的人口里,最多的是船员,其次是三等舱的人。存活人口里,一等舱,二等舱人数最多。

5 树状图和旭日图

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

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

library(treemap)
library(dplyr)
 
# 数据准备:将Titanic数据集转换为适合树状图的形式
titanic_df <- as.data.frame(Titanic)
titanic_summary <- titanic_df %>%
  group_by(Class, Sex, Age, Survived) %>%
  summarise(Total = sum(Freq)) %>%
  ungroup()
 
# 绘制树状图
treemap(titanic_summary,
        index = c("Class", "Sex", "Age", "Survived"),
        vSize = "Total",
        type = "index",
        title = "Titanic Survival Treemap")

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

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

5.3 介绍图形特点和信息

  • 树状图:适合展示多维数据的信息,通过面积和颜色可容易了解数据。第一个分类变量是舱位等级,粉色是船员,人数最多,绿色是三等舱,人数次于船员,棕黄色是一等舱,蓝色是三等舱。第二个分类变量是性别,第三个分类变量是年龄,第四个分类变量为生还。但是

  • 旭日图:动态图!!!很好地用来展示的工具图像。环形的面积越大代表占比越高。图形信息从中间向外层拓展。

信息

  • 层次关系:清晰地展示了不同分类之间的层次关系和数量分布。

6 热图和南丁格尔玫瑰图

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

6.1 数据准备

df<-data
datatable(df,rownames = FALSE)
# 图(a)class和survived的点阵图
palette<-rev(brewer.pal(11,"Blues"))       # 设置调色板
library(ggpubr)
p1<-ggballoonplot(df,x="Class",y="Survived",   # 设置图形的x轴和y轴
   shape=21,                    # 设置形状,默认21,可选22,23,24,25
   size="Freq",fill="Freq",                 # 设置点的大小和填充颜色变量
   size.range = c(1,12),                    # 设置最小点和最大点的范围
   rotate.x.text=FALSE,                     # x轴文本标签不旋转
   ggtheme=scale_fill_gradientn(colors=palette))+  # 设置渐变颜色
   theme(axis.text.y=element_text(angle=90))+      # y轴标签旋转90度
   ggtitle("(a)  乘客船舱和生还的点阵图")

# 图(b)按性别分面
p2<-ggballoonplot(df,x="Class",y="Survived",
   size="Freq",fill="Freq",shape=22,        # 用正方形表示数据点
   size.range = c(1,12),                    # 设置最小点和最大点的范围
   rotate.x.text=FALSE,                     # x轴文本标签不旋转
   facet.by=c("Sex"),                      # 按性别分面
   ggtheme=scale_fill_gradientn(colors=palette))+
   theme(axis.text.y=element_text(angle=90))+
   ggtitle("(b)  按性别分面的点阵图")

ggarrange(p1,p2,ncol=2)    # 按2列组合图形p1和p2

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

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

#这个数据需要根据class合并一下
df1 <- data%>%                                # 提取数据,构建新的数据框
  select(Class,Survived,Freq)%>%
  group_by(Class,Survived)%>%
  summarise(n=sum(Freq))%>%
  mutate(乘客船舱=fct_inorder(Class))    

df2 <- data%>%                                # 提取数据,构建新的数据框
  select(Class,Freq)%>%
  group_by(Class)%>%
  summarise(n=sum(Freq))%>%
  mutate(乘客船舱=fct_inorder(Class))    

df3 <- data%>%                                # 提取数据,构建新的数据框
  select(Survived,Freq)%>%
  group_by(Survived)%>%
  summarise(n=sum(Freq))

myangle<-seq(-20,-340,length.out=8)
# 设置标签角度,使之垂直于坐标轴
palette1<-brewer.pal(8,"Spectral")            # 设置离散型调色板

p1<-ggplot(df1,aes(x=interaction(Class,Survived),y=n,fill=interaction(Class,Survived)))+           
  geom_col(width=1,colour="grey20",fill=palette1)+# 绘制条形图
  coord_polar(theta="x",start=0)+   # 转化成极坐标图
  theme(axis.text.x=element_text(size=7,angle=myangle))+ # 设置坐标轴标签字体大小和角度
  ylab("人数")+                   # 设置y轴标签
  ggtitle("(a) 按原始顺序排序")

myangle<-seq(-20,-340,length.out=4)
# 设置标签角度,使之垂直于坐标轴
palette2<-brewer.pal(4,"Spectral")            # 设置离散型调色板
p2<-ggplot(df2,aes(x=Class,y=n,fill=Class))+           
  geom_col(width=1,colour="grey20",fill=palette2)+# 绘制条形图
  coord_polar(theta="x",start=0)+   # 转化成极坐标图
  theme(axis.text.x=element_text(size=7,angle=myangle))+ # 设置坐标轴标签字体大小和角度
  ylab("人数")+                   # 设置y轴标签
  ggtitle("(b) 按原始顺序排序")

myangle<-seq(-20,-340,length.out=2)
# 设置标签角度,使之垂直于坐标轴
p3<-ggplot(df3,aes(x=Survived,y=n,fill=Survived))+           
  geom_col(width=1,colour="grey20")+# 绘制条形图
  coord_polar(theta="x",start=0)+   # 转化成极坐标图
  theme(axis.text.x=element_text(size=7,angle=myangle))+ # 设置坐标轴标签字体大小和角度
  ylab("人数")+                   # 设置y轴标签
  ggtitle("(c) 按原始顺序排序")
gridExtra::grid.arrange(p1,p2,p3,ncol=2)      # 按2列组合图形

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

titanic_survived_total <- titanic_df %>%
  group_by(Survived) %>%
  summarise(Total = sum(Freq))
 
# 使用ggplot2模拟南丁格尔玫瑰图
ggplot(titanic_survived_total, aes(x = "", y = Total, fill = Survived)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar(theta = "y") +
  labs(title = "Titanic Survival Nightingale Rose Chart",
       fill = "Survived") +
  theme_void() +
  theme(legend.position = "right")

6.4 介绍图形特点和信息

  • 图形特点

    • 扇形面积:南丁格尔玫瑰图通过扇形的面积表示数值的大小。

    • 极坐标系:使用极坐标系展示数据。

    信息

    • 幸存比例:展示了幸存和未幸存乘客的总数比例。

7 饼环图

绘制Class和 Sex的饼环图。

7.1 数据准备

df1 <- data%>%                                # 提取数据,构建新的数据框
  select(Class,Freq)%>%
  group_by(Class)%>%
  summarise(n=sum(Freq))

df2 <- data%>%                                # 提取数据,构建新的数据框
  select(Sex,Freq)%>%
  group_by(Sex)%>%
  summarise(n=sum(Freq))

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

library(ggiraphExtra)

p1<-ggDonut(df1,aes(donuts=Class,count=n),
  labelposition=1,labelsize=2.5,             # 设置标签位置和大小
  xmin=2,xmax=4,                             # 设置x的最小位置和最大位置
  title="(a) 乘客船舱")                          # 设置标题
p2<-ggDonut(df2,aes(donuts=Sex,count=n),
  labelposition=1,labelsize=2.5,xmin=2,xmax=4,
  title="(b) 性别")                          # 设置标题
grid.arrange(p1,p2,ncol=2)                   # 按2列组合图形p1和p3

7.3 介绍图形特点和信息

  • 饼环图跟旭日图差不多,不过效果没那么好,是静态图,反应的信息也没这么多。

  • 图一展示了舱位人数信息,船员最多,其次是三等舱。

    图二展示了性别的信息,其中男性最多。