公众号里的文章大多数需要编程基础,如果因为代码看不懂,而跟不上正文的节奏,可以来找我学习,相当于给自己一个新手保护期。我的课程都是循环开课,点进去咨询微信,随时可以报名↓ 生信分析直播课程(每月初开一期) 生信新手保护学习小组长期报名中(每月一期) 单细胞陪伴学习小组(每月一期)
这篇推文的来源又是我那可爱的学生想要,刚好有空,可以整理一下。

条形图是一种常见的数据可视化工具,它通过长方形的长度来表示数据的大小。在实际应用中,条形图有多种形态,不只是展示比例,还可以展示数量,每种形态都有其独特的使用场景,应该系统地都学一学。

比例堆积条形图,主要用于展示不同类别在总体中所占的比例关系。当我们想要了解各个部分在整体中所占的份额时,这种图表能够清晰地呈现出各部分之间的相对比例。例如,做ciborsort免疫浸润时,可以用比例堆积条形图展示不同的免疫细胞在每个样本中的占比。
计数堆积条形图,则侧重于展示不同类别在各个分组下的数量总和。它能够直观地呈现出每个分组中不同类别的数量分布,体现每个分组中各类别对总量的贡献。
计数并列条形图,适合用于比较不同类别在各个分组下的数量差异。通过将不同类别的条形并列放置,可以看到每个分组中不同类别的数量对比情况。
我们选用的是ggplot2 内置的 diamonds 数据集,它是一个关于钻石相关信息和价格的数据集,共有 53940 行,10 列。这个数据集涵盖了钻石的多个重要属性,为我们通过条形图展示数据提供了丰富的素材。
library(ggplot2)
str(diamonds)
## tibble [53,940 × 10] (S3: tbl_df/tbl/data.frame)
## $ carat : num [1:53940] 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
## $ cut : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
## $ color : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
## $ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
## $ depth : num [1:53940] 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
## $ table : num [1:53940] 55 61 65 58 58 57 57 55 61 61 ...
## $ price : int [1:53940] 326 326 327 334 335 336 336 337 337 338 ...
## $ x : num [1:53940] 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
## $ y : num [1:53940] 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
## $ z : num [1:53940] 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...
在绘制这三种条形图时,我们主要用到了 diamonds 数据集中的 cut(切工)和 color(颜色)两列。
cut是切工,分Fair(一般)、Good(好)、Very Good(非常好)、Premium(优质)、Ideal(理想)五个等级,每个等级对应的钻石数量统计如下。
table(diamonds$cut)
##
## Fair Good Very Good Premium Ideal
## 1610 4906 12082 13791 21551
color是颜色,按照字母标识,数量统计如下。
table(diamonds$color)
##
## D E F G H I J
## 6775 9797 9542 11292 8304 5422 2808
library(dplyr)
meta_pct <- diamonds %>%
count(cut, color) %>%
group_by(cut) %>%
mutate(pct = n / sum(n))
p1 <- ggplot(meta_pct, aes(cut, pct, fill = color)) +
geom_bar(stat = "identity") +
theme_classic()
p1

geom_bar()会自动统计每个cut组中不同color的数量,只需提供横坐标和纵坐标中的一个,两个都提供就会报错。加上参数stat = "identity"表示数据无需统计,直接以提供的横纵坐标来画图。
p2 <- ggplot(diamonds, aes(cut, fill = color)) +
geom_bar() +
theme_classic()
p2

geom_bar()会自动统计每个cut组中不同color的数量,实现计数功能。
p3 <- ggplot(diamonds, aes(cut, fill = color)) +
geom_bar(position = "dodge") +
theme_classic()
p3

关键参数是position = "dodge",它的作用是将不同颜色的柱子并列放置,实现计数并列。
library(patchwork)
p1 + p2 + p3 + plot_layout(guides='collect')

(p1 + p2) / p3 + plot_layout(guides='collect')

从拼接好的图形中,我们可以更加直观地对比三种条形图的特点,选择更适合的,化为己用。