跟着 cell 绘制条形堆叠图和分面小提琴图
感谢老俊俊的大力支持。我们会每日跟新,欢迎您关注老俊俊的生信笔记。

起源
今天啥都没干,就画了两张图。嗯。就是这样。
昨晚在我的 老俊俊生信交流群 里有小伙伴问怎么绘制一篇单细胞文献里的柱形堆叠图
还有小提琴分面图
,今天花了一天时间研究了一下,分享一下绘制的代码和心得。
没有加群的小伙伴们可以直接加我微信,我拉你进群。
文章里的柱形堆叠图:

文章里的小提琴图:

然后找了这位小伙伴要了一小部分数据来测试一下。当然只是出于我的 兴趣 才要画的,哈哈。
尝试
小伙伴提供的绘制条形图的数据已经整理成长格式的数据类型了,我们只需要画图就可以了。
此外 需要注意的是 ,文章里的条形图同一个颜色块里还有许多白色横杠
,横坐标对应着细胞类型,也就是说针对同一种细胞类型还做了样本的分类
,所以在绘制堆叠条形图的基础上还需要加入样本的分类的信息。
加载 R 包:
library(ggplot2)
library(ggprism)
library(ggsci)
library(patchwork)
library(reshape2)
# 读取数据
dat <- read.csv('C:/Users/admin/Desktop/table.csv',header = T,row.names = 1)
# 查看
head(dat)
sample celltype count group
1 BA07 CD14+ Mono 337 BACT
2 BA08 CD14+ Mono 314 BACT
3 BA09 CD14+ Mono 87 BACT
...
sample
是我们的样本分类,我们先分别绘制按 sample
和 group
绘制:
# 按sample填充颜色
p1 <- ggplot(dat,aes(x = celltype,y = count)) +
geom_bar(aes(fill = sample),
stat = 'identity',position = 'fill',
show.legend = T) +
theme_prism() + xlab('') +
# 把Y坐标以百分比显示
scale_y_continuous(labels = scales::label_percent()) +
# 自定义填充颜色
scale_fill_manual(values = rainbow(18)) +
# 调整x轴标签旋转角度
theme(axis.text.x = element_text(angle = 45,hjust = 1,vjust = 1))
# 按group填充颜色
p2 <- ggplot(dat,aes(x = celltype,y = count)) +
geom_bar(aes(fill = group),
stat = 'identity',position = 'fill',
show.legend = T) +
# 使用ggsci的颜色
scale_fill_nejm() +
theme_prism() + xlab('') +
scale_y_continuous(labels = scales::label_percent()) +
theme(axis.text.x = element_text(angle = 45,hjust = 1,vjust = 1))
# 绘图
p1 + p2

接下来我们需要在 p2 中把 p1 每个样本的数量以白色横杠添加上去。条形图含有 fill 和 color 两个属性,对应着柱形图的填充色
和边框颜色
。
我们的思路是把 p2 的柱子填充色用 group 来分类
,柱子的边框颜色用 sample 来分类
,然后把边框颜色全部调成白色
即可达到目的。
此外这样我们就有两个映射,自然会有 两个图例 ,我们再把按 sample 映射的图例删除即可。
还需要验证每个细胞类型的样本数量是否一致,我们检查白色横杠的位置是否对应 p1 的分界线即可。
p3 <- ggplot(dat,aes(x = celltype,y = count)) +
geom_bar(aes(fill = group,color = sample),
stat = 'identity',position = 'fill',
show.legend = T) +
scale_fill_nejm() +
# 把sample映射的边框颜色代替为白色
scale_color_manual(values = rep('white',18)) +
# 去除sample映射的图例
guides(fill = 'legend',color = 'none') +
theme_prism() + xlab('') +
scale_y_continuous(labels = scales::label_percent()) +
theme(axis.text.x = element_text(angle = 45,hjust = 1,vjust = 1),
legend.position = 'right',
legend.title = element_blank())
# 拼图
p1 + p3 + p2

检查一下第一张图和第二张图的白色线条位置和第一张也是对应的,图就成功画出来了。
接下来挑战一下绘制小提琴图:
# 读取数据
vio <- read.table('C:/Users/admin/Desktop/vio.txt',header = T,row.names = 1)
# 查看内容
head(vio,3)
ACTB B2M CD74 EEF1A1 FTH1 FTL SAT1 TMSB10
07_TCTTTCCAGAGCTGGT-1 5.181198 4.743441 4.892507 5.322106 5.654493 5.659865 4.365394 4.795638
02_CCTAAAGAGTCCGTAT-1 4.397687 4.939036 4.483672 5.014497 5.425808 4.636208 2.957070 4.397687
2_CACTCCAAGCATCATC-1 5.284045 3.956434 6.224142 4.742207 4.476622 5.176734 2.935624 4.886736
TMSB4X TPT1 cell_type
07_TCTTTCCAGAGCTGGT-1 4.875045 4.345650 CD14+Mo
02_CCTAAAGAGTCCGTAT-1 4.143471 4.397687 CD14+Mo
2_CACTCCAAGCATCATC-1 5.151238 4.397527 CD14+Mo
我随便挑了 10 个基因,最后一列是 细胞类型分类 ,我们需要转成长数据。
我们仔细观察一下文章的小提琴图,横坐标是 基因名 ,但是小提琴图却是 从左向右 的,所以 x 轴不应该是 表达量值 吗?作者应该是对图做了一个坐标轴翻转
,然后是根据基因来进行分面
的。
绘图:
# 转成长数据
new_vio <- melt(vio)
# 绘图
ggplot(new_vio,aes(x = cell_type,y = value)) +
geom_violin(aes(fill = cell_type),show.legend = F) +
theme_bw() +
# 坐标轴翻转
coord_flip() +
# 按基因分面
facet_grid(~variable,scales = 'free') +
# 把横坐标放到上边
scale_x_discrete(position = 'top') +
xlab('') + ylab('') +
# 使用ggsci配色
scale_fill_lancet() +
# 细节调整
theme(panel.grid = element_blank(),
# 分面x标签背景
strip.background.x = element_blank(),
panel.border = element_rect(size = 1.2),
axis.line = element_line(size = 1.2),
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
axis.text.y = element_text(face = 'bold',size = 14),
# 分面x标签旋转角度
strip.text.x = element_text(angle = 45,vjust = 0.25,hjust = 0,face = 'bold',size = 14),
# 分面panel x轴上间距
panel.spacing.x = unit(0,'mm')
)

欧克,还行,上面的标签好像搞不下来,在 Ai 里 p 一下就可以了。

发现更多精彩
关注公众号
欢迎小伙伴留言评论!
今天的分享就到这里了,敬请期待下一篇!
最后欢迎大家分享转发,您的点赞是对我的鼓励和肯定!
如果觉得对您帮助很大,赏杯快乐水喝喝吧!
推 荐 阅 读
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!