= as.data.frame(Titanic)
data ::datatable(data,rownames = FALSE) DT
解释原始数据
Titanic
数据集是datasets
包的配套案例数据,可以通过as.data.frame
将其转化为数据框。解析数据包含哪些变量,如果是分类变量分别有哪些类别?- Titanic数据集记录了泰坦尼克号乘客的生存情况,包含4个分类变量和1个数值变量。分类变量包括:乘客等级(Class,1/2/3/船员)、性别(Sex,男/女)、年龄(Age,成人/儿童)、生存状态(Survived,是/否)。数值变量为乘客计数(Freq)。数据以列联表形式呈现,通过交叉分类反映不同群体生存率差异,如女性、高等舱乘客存活率更高。该数据集常用于演示列联表分析和逻辑回归等统计方法。
条形图
绘制Sex和 Survived的并列条形图和堆叠条形图,并为条形图添加频数标签。
数据准备
下面代码作了什么数据处理?为什么要这样处理?
数据抽取:从原始数据中筛选关键变量(
Sex
、Survived
和Freq
),减少冗余信息,便于分析核心关系(如性别与生存率)。
分组汇总:按性别和生存状态分组统计人数,形成结构化摘要,直观呈现不同群体的分布差异。
数据整理与可视化优化:通过重命名列名、交互式表格展示提升可读性,为后续分析(如统计检验或图形绘制)奠定基础。通过精简变量、聚合数据增强分析效率,适用于探索分类变量间的关联模式。
# 数据准备
<- data %>% select(Sex,Survived,Freq) %>%
df summarise(n=sum(Freq),.by=c(Sex,Survived)) %>%
rename(性别=Sex,生还=Survived,人数=n)
::datatable(df,rownames = FALSE) DT
利用geom_col函数作图
# 图(a)垂直并列条形图
<-ggplot(df,aes(x=性别,y=人数,fill=生还))+
p1geom_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) 水平并列条形图
<-ggplot(df,aes(x=性别,y=人数,fill=生还))+
p2geom_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)垂直并列条形图
<-ggplot(df,aes(x=性别,y=人数,fill=生还))+
p1geom_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" = "是"
) )
Scale for fill is already present.
Adding another scale for fill, which will replace the existing scale.
# 图(b) 水平并列条形图
<-ggplot(df,aes(x=性别,y=人数,fill=生还))+
p2geom_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(
"Male" = "男",
"Female" = "女"
)+
)scale_fill_discrete(
"生还",
labels = c(
"No" = "否",
"Yes" = "是"
) )
Scale for fill is already present.
Adding another scale for fill, which will replace the existing scale.
grid.arrange(p1,p2,ncol=2) # 按2列组合图形
介绍图形特点和信息
- 可以看出,性别与生存率存在明显关联:女性乘客的生还比例显著高于男性,而男性乘客的总人数虽多,但生存率较低
帕累托图
绘制Class 的帕累托图。
数据准备
<-data |>
dfselect(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)
利用geom_col()+geom_line()+geom_point()
等函数作图
<-rev(brewer.pal(4,"Reds")) # 设置调色板
palette# 绘制条形图
<-ggplot(df)+aes(x=乘客舱位,y=人数)+
pgeom_col(width=0.8,fill=palette,color="grey50")+# 绘制条形图
scale_x_discrete(labels=c("船员仓","三等仓","一等仓","二等仓"))+ # 将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") # 删除图例
# 绘制折线和点
<-p+geom_line(aes(x=as.numeric(乘客舱位),y=累积百分比*max(人数/100)))+ # 绘制累积百分比曲线
p1geom_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)))# 添加坐标轴
+annotate("text",x=4.5,y=900,label="百分比(%)",angle=90,size=3.5)+
p1annotate("text",x=3.5,y=1000,label="累积百分比曲线",size=3.5) # 添加注释文本
介绍图形特点和信息
- 从图中可以看出船员所占比例较大。二等舱与一等舱乘客数量差距较大。
脊形图
绘制Class和 Survived 的脊形图。
数据准备
# 数据处理
<- data %>% select(Class,Survived,Freq) %>%
df summarise(n=sum(Freq),.by=c(Class,Survived)) %>%
mutate(percent = n*100/sum(n),.by = "Class")
datatable(df,rownames = FALSE)
利用geom_col()
作图
ggplot(df)+aes(x=Class,y=percent,fill=Survived)+ylab("百分比(%)")+
geom_col(stat="identity",width=0.8,color="grey50")+
scale_fill_brewer(palette="Blues")
Warning in geom_col(stat = "identity", width = 0.8, color = "grey50"): Ignoring
unknown parameters: `stat`
利用ggiraphExtra包ggSpine()
ggSpine(data=df,aes(x=Survived,y=percent,fill=Class),stat="identity",palette="Reds",labelsize=3,reverse=TRUE) # 反转调色板颜色
Warning: The `guide` argument in `scale_*()` cannot be `FALSE`. This was deprecated in
ggplot2 3.3.4.
ℹ Please use "none" instead.
ℹ The deprecated feature was likely used in the ggiraphExtra package.
Please report the issue to the authors.
介绍图形特点和信息
- 从图中可以看出一等舱和二等舱乘客的存活率显著高于船员及三等舱乘客,反映出救援过程中明显的阶级差异,高阶舱位乘客优先获救。
树状图和旭日图
绘制Class、Sex、Age和Survived4个变量的矩形树状图和旭日图
利用treemap::treemap()
函数作树状图
<-data%>%
dfrename(频数=Freq) # 将Freq命名为频数
datatable(df,rownames = FALSE)
treemap(df,index=c("Age","Sex","Class","Survived"), # 设置聚合索引的列名称
vSize="频数", # 指定矩形大小的列名称
#fontsize.labels=10, # 设置标签字体大小
position.legend="bottom", # 设置图例位置
title="(a) 分层顺序:Sex-Age-Class-Survived")
利用sunburstR::sunburst()
函数作旭日图
- 通过
d3r::d3_nest
将数据框转化为层次数据“d3.js”作为绘图输入
library(d3r)
<-data%>%select("Age","Sex","Class","Survived","Freq") # 根据需要调整列变量的位置
df<-d3_nest(df,value_cols="Freq") # 将数据框转换为“d3.js”层次结构
df_treedatatable(df,rownames = FALSE)
library(sunburstR)
sunburst(data=df_tree, # 绘制旭日图
valueField="Freq", # 计算大小字段的字符为vSize
count=TRUE, # 在解释中包括计数和总数
sumNodes=TRUE) # 默认总和节点=TRUE
介绍图形特点和信息
成年人占绝对主体(约75.7%为男性),其中船员群体的未存活比例尤为突出(占未存活总数的30.4%),反映出灾难中成年男性船员因职业职责或救援优先级而面临更高风险。这一分布也印证了”妇女儿童优先”救援原则对生存率的显著影响。
热图和南丁格尔玫瑰图
绘制Class和Survived 的点阵图、热图和南丁格尔玫瑰图。
数据准备
<-data%>%select(Class,Survived,Freq) %>%
dfsummarise(n=sum(Freq),.by=c(Class,Survived))
datatable(df,rownames = FALSE)
利用ggiraphExtra::ggHeatmap()
作热力图
分别作矩形热图和极坐标热图
library(ggiraphExtra)
<-ggHeatmap(data,aes(x=Class,y=Survived,fill = Freq), # 绘制矩形热图
p1addlabel=TRUE, # 添加数值标签
palette="Reds")+ # 使用红色调色板
ggtitle("(a1) 矩形热图") # 添加标题
Scale for x is already present.
Adding another scale for x, which will replace the existing scale.
Scale for y is already present.
Adding another scale for y, which will replace the existing scale.
<-ggHeatmap(data,aes(x=Class,y=Survived,fill = Freq),polar=TRUE,
p2addlabel=TRUE,palette="Reds")+ # 绘制极坐标热图
ggtitle("(a2) 极坐标热图")
Scale for x is already present.
Adding another scale for x, which will replace the existing scale.
Scale for y is already present.
Adding another scale for y, which will replace the existing scale.
grid.arrange(p1,p2,ncol=2) # 按2列组合图形p1、p2、p3、p4
利用ggiraphExtra::ggRose()
作玫瑰图
$Class <- factor(data$Class, ordered = TRUE,
datalevels = c("1st", "2nd", "3rd", "Crew"))
# 将支出项目变为有序因子
<- data %>%
df1 summarise(Count=sum(Freq),.by=c(Class,Survived))
# 设置标签角度,使之垂直于坐标轴
<-seq(-20,-340,length.out=4)
myangle<-brewer.pal(4,"Set3") # 设置离散型调色板
palette
# 绘制玫瑰图
<-ggplot(df1,aes(x=Class,y=Count,fill=Survived))+
p1geom_col(width=1,colour="grey20",position = "stack")+# 绘制条形图
scale_fill_manual(values = palette) +
coord_polar(theta="x",start=0)+ # 转化成极坐标图
theme(axis.text.x=element_text(size=5,angle=myangle))+ # 设置坐标轴标签字体大小和角度
ylab("人数")+ # 设置y轴标签
ggtitle("(a) 泰坦尼克号乘客生存情况")
Warning: Vectorized input to `element_text()` is not officially supported.
ℹ Results may be unexpected or may change in future versions of ggplot2.
library(ggrepel)
Warning: package 'ggrepel' was built under R version 4.3.3
<-p1+geom_text_repel(aes(y=Count-100,label=Count),size=2,color="grey30")# 为图形添加文本,并设置文本字体大小和颜色
p1
::grid.arrange(p1) gridExtra
介绍图形特点和信息
- 船员在乘员中占比最高,且船员与一等舱乘客的存活人数显著较多,而二等舱乘客的存活率最低,这可能与救援资源配置及舱位优先级有关。
饼环图
绘制Class和 Sex的饼环图。
数据准备
<- data %>% select(Sex,Class,Freq) %>%
df summarise(n=sum(Freq),.by=c(Sex,Class)) %>%
rename(性别=Sex,乘客舱位=Class,人数=n)
::datatable(df,rownames = FALSE) DT
利用ggiraphExtra::ggPieDonut()
作饼环图
library(ggiraphExtra)
<-ggPieDonut(
p1data=df,aes(pies=性别,donuts=乘客舱位,count =人数),
title="(a) 性别为饼图,乘客舱位为环形图")
::grid.arrange(p1) # 按2列组合图形p1和p2 gridExtra
介绍图形特点和信息
- 男性乘客占比 78.6%,显著高于女性(21.4%),反映当时船上男性比例占绝对多数。船员占比最高(39.2%),其次是 三等舱,而 一等舱 和 二等舱比例相近。在女性乘客中,三等舱占比(8.9%) 仍然较高,但 一等舱女性(6.6%) 的比例明显高于 二等舱(4.8%),印证了头等舱女性在救援中可能享有优先权。