准备:
Today's dataset:
Three excel files (employment survey, smoking and drinking habits and students_BMI_2)
Today's package:
library(ggplot2)
library(gmodels)
知识预览
- 饼图 (Pie Chart): 记住使用
geom_bar
和coord_polar
结合制作饼图,geom_text
添加标签。 - 条形图 (Bar Chart): 记住
geom_bar
用于制作条形图,position="dodge"
并排显示,facet_wrap
分面显示。 - 直方图 (Histogram): 记住
geom_histogram
用于制作直方图,binwidth
控制宽度,geom_density
添加密度图层。
准备数据
1. 饼图 (Pie Chart)
基本饼图
ggplot(count.smokers, aes(x="", y=prop, fill=smoke)) +
geom_bar(width=1, stat="identity", color="white") +
coord_polar("y", start=0)
ggplot(data, aes(x, y, fill))
: 设置数据源和映射,这里的x
是空字符串,因为饼图不需要 x 轴。geom_bar(width=1, stat="identity", color="white")
: 使用条形图层创建饼图,设置stat="identity"
表示直接使用y
的值。coord_polar("y", start=0)
: 将坐标系转换为极坐标,制作饼图。prop
是一个表示比例的变量。在饼图中,每个扇形的大小是根据这个比例来决定的。比如,如果prop
是 0.2,那么这个扇形就会占据饼图的 20%。smoke
是一个表示不同类别的变量。在这个例子中,它可能代表不同的吸烟状态,比如 "从未吸烟"、"偶尔吸烟" 等。fill=smoke
的作用是给饼图的不同扇形上色。不同的smoke
类别会有不同的颜色,这样我们就可以通过颜色来区分各个扇形代表的是哪种吸烟状态。
添加百分比标签
+ geom_text(aes(label=paste0(round(prop*100), "%")), position=position_stack(vjust=0.5))
geom_text(aes(label))
: 添加文本层,显示百分比标签。position_stack(vjust=0.5)
: 调整文本位置,使其位于扇形中心。
移除图表元素
+ theme(panel.background = element_blank(),
axis.text = element_blank(),
axis.line = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank(),
plot.title = element_blank())
theme()
: 自定义图表主题,在从柱状图转化为饼图之后,需要移除不必要的元素。
2. 条形图 (Bar Chart)
基本条形图
ggplot(Student_BMI_2, aes(fill=`place of birth`, x=Dpt)) +
geom_bar(position="dodge")
geom_bar(position="dodge")
: 创建条形图,position="dodge"
表示并排显示不同的填充类别。
place of birth
是一个表示出生地点的变量。不同的出生地点会有不同的颜色。Dpt
是一个表示部门的变量。在这个例子中,它可能代表不同的学院或者系。fill=place of birth
的作用是给条形图的不同部分上色。这样我们就可以通过颜色来区分来自不同出生地点的学生在各个部门的分布情况。- 在条形图中,
position="dodge"
的作用是将不同类别的条形并排放置,而不是堆叠在一起。这样做的好处是可以更清晰地比较不同类别在每个组别(在这个例子中是不同的部门Dpt
)中的数量。 -
position="stack"
: 这是默认的设置,它会将不同类别的条形堆叠在一起。这种方式适合于展示总体的分布情况,但不便于比较不同类别之间的差异。 -
position="fill"
: 这种设置会将每个条形的高度调整为相同的值,但保留不同类别在条形中的比例。这种方式适合于比较不同类别在总体中所占的比例。 -
position="identity"
: 这种设置会使得所有的条形都从相同的基线开始,可能会导致条形之间的重叠。这种方式不常用于条形图,但在某些特殊情况下可能会有用处。
分面显示
+ facet_wrap(~Gender)
facet_wrap(~variable)
: 按照 variable
的不同类别分面显示图表。
调整条形堆叠方式
geom_bar(position="fill")
position="fill"
: 调整条形图的堆叠方式,使每个堆叠的条形高度相同,便于比较比例。
3. 直方图 (Histogram)
基本直方图
ggplot(Student_BMI_2, aes(fill=Gender, x=BMI)) +
geom_histogram(position="stack", alpha=0.5, binwidth=2)
geom_histogram(binwidth=2)
: 创建直方图,binwidth
控制每个柱的宽度。
place of birth
是一个表示出生地点的变量。不同的出生地点会有不同的颜色。Dpt
是一个表示部门的变量。在这个例子中,它可能代表不同的学院或者系。fill=place of birth
的作用是给条形图的不同部分上色。这样我们就可以通过颜色来区分来自不同出生地点的学生在各个部门的分布情况。
添加密度图层
+ geom_density(position="stack", alpha=0.5)
geom_density()
: 添加密度图层,position="stack"
表示堆叠显示,alpha
控制透明度。
具体代码分析:
准备饼图数据
smoking_and_drug_use_amongst_English_pupils$CgStat2 <- smoking_and_drug_use_amongst_English_pupils$CgStat
smoking_and_drug_use_amongst_English_pupils$CgStat2 <- recode(smoking_and_drug_use_amongst_English_pupils$CgStat2, "I have never smoked"="never smoked", "I have only ever tried smoking once"="tried once", ...)
- 数据源:
smoking_and_drug_use_amongst_English_pupils
- 这里使用
recode
函数将CgStat
列中的原始文本值转换为更简洁的类别标签,以便于后续制作饼图。
制作饼图
count.smokers <- data.frame(smoke=c("NA", "never smoked", ...), n=c(51, 5900, ...), prop=c(0.007, 0.777, ...))
ggplot(count.smokers, aes(x="", y=prop, fill=smoke)) +
geom_bar(width=1, stat="identity", color="white") +
coord_polar("y", start=0)
- 数据源:
count.smokers
- x: 空字符串
""
(饼图不需要 x 轴) - y: 比例
prop
- 填色:
smoke
类别 - 图的种类: 饼图,使用
geom_bar
和coord_polar
结合实现 coord_polar("y", start=0)
将条形图转换为饼图,"y"
表示使用y
轴的值来确定扇形的大小,start=0
设置起始角度为 0 度。geom_bar(width=1, stat="identity", color="white")
创建了一个宽度为 1 的条形图,stat="identity"
表示直接使用y
的值,color="white"
设置条形图的边框颜色为白色。
添加百分比标签
+ geom_text(aes(label=paste0(round(prop*100), "%")), position=position_stack(vjust=0.5))
- 这一行代码添加了文本标签,显示每个扇形的百分比。
geom_text
: 这是ggplot2
包中用于添加文本标签的函数。aes(label=paste0(round(prop*100), "%"))
: 这里设置了文本标签的内容。label
是文本标签要显示的内容,paste0
函数用于将多个字符串连接在一起,round(prop*100)
将prop
的值(表示比例)乘以 100 并四舍五入得到整数百分比,最后加上 "%" 符号形成最终的百分比字符串。position=position_stack(vjust=0.5)
: 这里设置了文本标签的位置。position_stack
函数用于调整堆叠图层中元素的位置,vjust=0.5
参数使得文本标签垂直居中于各个扇形。
移除图表元素
+ theme(panel.background = element_blank(), axis.text = element_blank(), ...)
这一行代码通过 theme
函数移除了图表的背景、坐标轴文本等元素,使图表看起来更简洁。
theme(axis.text.x = element_text(angle = 45, size=8, vjust=0.7)) + labs(x="")
- 这段代码调整了图表的主题和样式。
axis.text.x = element_text(angle = 45, size=8, vjust=0.7)
设置 x 轴文本的角度为 45 度,字体大小为 8,垂直调整为 0.7,以改善标签的可读性。 labs(x="")
移除了 x 轴的标签。
使用 ggpie
制作饼图
ggpie(count.smokers, "prop", label="smoke", lab.pos="out", fill="smoke", label.size=4, offset=0.5)
ggpie
是ggpubr
包中的一个函数,专门用于制作饼图。- 参数:
- 第一个参数是数据源
count.smokers
。 "prop"
指定饼图的比例来自prop
列。label="smoke"
设置标签内容为smoke
列的值。lab.pos="out"
将标签放置在扇形外部。fill="smoke"
设置扇形的填充颜色根据smoke
列的值。label.size=4
设置标签字体大小为 4。offset=0.5
调整标签的位置。
- 第一个参数是数据源
-
制作条形图
ggplot(Student_BMI_2, aes(fill=`place of birth`, x=Dpt)) + geom_bar(position="dodge")
- 数据源:
Student_BMI_2
- x: 部门
Dpt
- 填色: 出生地
place of birth
- 图的种类: 条形图,使用
geom_bar
- 图的额外效果:
position="dodge"
使得不同出生地的条形并排显示,而不是堆叠。
使用 facet_wrap
分面显示
+ facet_wrap(~Gender)
这一行代码使用 facet_wrap
函数将图表按照性别 Gender
分面显示,即每个性别一个小图表。
制作直方图
ggplot(Student_BMI_2, aes(fill=Gender, x=BMI)) +
geom_histogram(position="stack", alpha=0.5, binwidth=2)
- 数据源:
Student_BMI_2
- x: BMI 值
BMI
- 填色: 性别
Gender
- 图的种类: 直方图,使用
geom_histogram
- 图的额外效果:
position="stack"
将不同性别的柱子堆叠起来,alpha=0.5
设置透明度为 0.5,binwidth=2
设置每个柱子的宽度为 2。
添加密度图层
+ geom_density(position="stack", alpha=0.5)
- 这一行代码使用
geom_density
函数添加了一个密度图层,用于显示数据的分布情况。 position="stack"
表示不同性别的密度曲线将被堆叠显示。alpha=0.5
设置密度曲线的透明度为 0.5。
使用 facet_wrap
按年份分面显示
+ facet_wrap(~Year2)
这一行代码使用 facet_wrap
函数将图表按照年份 Year2
分面显示,即每个年份一个小图表。
设置图表标题
+ labs(title = "Occupation of CUHK SZ students after graduation")
这一行代码使用 labs
函数设置了图表的标题。
分面显示的直方图
ggplot(Student_BMI_2, aes(fill=Gender, x=BMI)) +
geom_histogram(position="stack", alpha=0.5, binwidth=2) +
facet_wrap(~Dpt)
这一段代码创建了一个按部门 Dpt
分面显示的直方图,其中每个部门的直方图显示了不同性别学生的 BMI 分布情况。
制作按年份分面显示的条形图
ggplot(Student_BMI_2, aes(fill=Gender, x=Dpt)) +
geom_bar(position="fill") +
facet_wrap(~Year)
- 这一段代码创建了一个按年份
Year
分面显示的条形图,其中每个年份的条形图显示了不同性别学生在各个部门的分布情况。 position="fill"
使得每个条形的高度都相同,便于比较不同性别在各个部门的比例。