[R] 饼图 (Pie Chart); 条形图 (Bar Chart);直方图(Histogram with density)

本文详细介绍了如何使用R语言中的ggplot2包,通过饼图、条形图和直方图对Excel数据进行可视化。内容包括基本图形制作、添加百分比标签、分面显示以及调整堆叠方式等技巧。
摘要由CSDN通过智能技术生成

准备:

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_barcoord_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_barcoord_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)
  • ggpieggpubr 包中的一个函数,专门用于制作饼图。
  • 参数:
    • 第一个参数是数据源 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" 使得每个条形的高度都相同,便于比较不同性别在各个部门的比例。
  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值