data = as.data.frame(Titanic)
DT::datatable(data,rownames = FALSE)第三章 类别数据可视化
1 解释原始数据
Titanic数据集是datasets包的配套案例数据,可以通过as.data.frame将其转化为数据框。解析数据包含哪些变量,如果是分类变量分别有哪些类别?包含座舱等级、性别、年龄、生存情况、人数,分类变量有座舱等级、性别、年龄、生存情况。
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轴范围
ggtitle("(a) 垂直并列条形图")+
scale_x_discrete("性别",labels=c("Male"="女","Female"="男"))+
scale_fill_discrete("生还",labels=c("No"="否","Yes"="是"))
# 图(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_x_discrete("性别",labels=c("Male"="女","Female"="男"))+
scale_fill_discrete("生还",labels=c("No"="否","Yes"="是"))+
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()等函数作图
palette<-rev(brewer.pal(4,"Reds")) # 设置调色板
# 绘制条形图
p<-ggplot(df)+aes(x=乘客舱位,y=人数)+
geom_col(width=0.8,fill=palette,color="grey50")+# 绘制条形图
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.3,y=100,label="百分比(%)",angle=90,size=3.5)+
annotate("text",x=3.5,y=650,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)ggplot(df)+aes(x=Survived,y=percent,fill=Class)+ylab("百分比(%)")+
geom_bar(stat="identity",width=0.8,color="grey50")+
scale_fill_brewer(palette="Blues")4.2 利用geom_col() 作图
df<-data |>
summarise(n=sum(Freq),.by=c(Class,Survived)) # 生成列联表并转化成数据框
datatable(df,rownames = FALSE)p1<-ggplot(df,aes(x=interaction(Class),y=n,fill=Class))+
geom_col(width=0.8, # 设置条形间距
position="dodge", # 绘制并列条形图
color="gray50")+ # 为条形图添加灰色边框
geom_text(aes(label=n),
position=position_dodge(0.9),
size=2.5,color="black",vjust=-0.5)+ # 设置标签字体大小、颜色和垂直位置调整
scale_fill_brewer(palette="Set2")+
scale_x_discrete(guide=guide_axis(n.dodge=2))+ # 设置x轴标签为2行
ylim(0,1.1*max(df$n))+ # 设置y轴范围
theme(legend.position="bottom")+
ggtitle("(a) x 轴交互分类的并列条形图")
p14.3 利用ggiraphExtra包ggSpine()
ggSpine(data,aes(x=Survived,fill=Class,facet=Sex),
palette="Reds",labelsize=3,reverse=TRUE) # 反转调色板颜色4.4 介绍图形特点和信息
5 树状图和旭日图
绘制Class、Sex、Age和Survived4个变量的矩形树状图和旭日图
5.1 利用treemap::treemap()函数作树状图
df<-data%>%
ftable()%>%
as.data.frame()%>%
rename(乘客座舱=Class,性别=Sex,年龄=Age,生还=Survived) #
datatable(df,rownames = FALSE)5.2 利用sunburstR::sunburst() 函数作旭日图
- 通过
d3r::d3_nest将数据框转化为层次数据“d3.js”作为绘图输入
5.3 介绍图形特点和信息
6 热图和南丁格尔玫瑰图
绘制Class和Survived 的点阵图、热图和南丁格尔玫瑰图。
6.1 数据准备
df<-data%>%ftable()%>%
as.data.frame()%>%
rename(人数=Freq) 6.2 利用ggiraphExtra::ggHeatmap()作热力图
分别作矩形热图和极坐标热图
library(ggiraphExtra)
p1<-ggHeatmap(data,aes(x=Class,y=Survived), # 绘制矩形热图
addlabel=TRUE, # 添加数值标签
palette="Reds")+ # 使用红色调色板
ggtitle("(a1) 矩形热图") # 添加标题
p2<-ggHeatmap(data,aes(x=Class,y=Survived),polar=TRUE,
addlabel=TRUE,palette="Reds")+ # 绘制极坐标热图
ggtitle("(a2) 极坐标热图")
p3<-ggHeatmap(data,aes(x=Class,y=Survived),
addlabel=TRUE,palette="Blues")+ # 使用蓝色调色板
ggtitle("(b1) 矩形热图")
p4<-ggHeatmap(data,aes(x=Class,y=Survived),polar=TRUE,
addlabel=TRUE,palette="Blues")+
ggtitle("(b2) 极坐标热图")
grid.arrange(p1,p2,p3,p4,ncol=2)ggHeatmap(data,aes(x=Class,y=Survived,facet=Sex),
polar=TRUE,addlabel=TRUE,
palette="Oranges")6.3 利用ggiraphExtra::ggRose() 作玫瑰图
6.4 介绍图形特点和信息
7 饼环图
绘制Class和 Sex的饼环图。
7.1 数据准备
7.2 利用ggiraphExtra::ggPieDonut()作饼环图
library(ggiraphExtra)
p1<-ggPieDonut(data,aes(pies=Class,donuts=Sex),
title="(a) 座舱类别为饼图,性别为环形图")
p1