跟着 Cell 学作图 | 桑葚图(ggalluvial)

桑葚图.jpg

今天我们复现一幅2021年CellGraphical abstract的图。

Title:Human oral mucosa cell atlas reveals a stromal-neutrophil axis regulating tissue immunity

DOI:10.1016/j.cell.2020.07.009

[TOC]

22

读图

Snipaste_2022-04-26_16-03-03.png

来看一下这个摘要图(红色箭头),作者用堆叠条形图来展示两组样本间比例的变化,中间又增加了连线让相同组分之间对对比更加的直观。一般这种数据就是以饼图或是堆叠条形图来展现,今天我们就用饼图条形图两种形式都来复现一下。

复现结果

image-20220423004309264.png

示例数据和代码领取

跟着 Cell 学作图 | 桑葚图(ggalluvial)

开始绘制

饼图

数据是三组样本蛋白质的亚细胞定位数据,一般的可视化方法就会用饼图来展示,饼图十分常见而且制作特别简单,大部分情况用excelorigin等软件都可以快速制作,所以在R中的相关函数很少。这里我们用到了tastypie包,其中的pie_bake函数生成一个ggplot对象可以非常方便的调整你的饼图。

# 加载包及导入数据
library(ggplot2)
library(ggthemes)
library(tidyverse)
library(ggalluvial)
library(ggsci)
library(cowplot)
library(tastypie)
rm(list = ls())
df=read.csv('Sublocation.csv',header = T)
head(df)
p1=pie_bake(data = data.frame(subloc=df$Subcellar.location,ratio=df$A),
           template = "blue1",#调色盘是必要参数,不影响手动添加颜色
           perc = TRUE,#显示百分比
           group_name = "a",
           title ='A')+
  theme_classic()+
  scale_fill_npg()+#ggsci中的调色盘
  theme(panel.background = element_blank(),
        axis.line.x = element_blank(),
        axis.line.y = element_blank(),
        axis.title.y = element_blank(),
        axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank(),
        legend.title = element_text(),
        plot.title = element_text(hjust = 0.5,vjust=-2,size = 15))+labs(fill = 'Subcellular location')
p2=pie_bake(data = data.frame(subloc=df$Subcellar.location,ratio=df$C),
         template = "blue1",
         perc = TRUE,
         group_name = "a",
         title ='C')+
  theme_classic()+scale_fill_npg()+
  theme(panel.background = element_blank(),
        axis.line.x = element_blank(),
        axis.line.y = element_blank(),
        axis.title.y = element_blank(),
        axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank(),
        legend.title = element_text(),
        plot.title = element_text(hjust = 0.5,vjust=-2,size = 15))+labs(fill = 'Subcellular location')
p3=pie_bake(data = data.frame(subloc=df$Subcellar.location,ratio=df$B),
         template = "blue1",
         perc = TRUE,
         group_name = "a",
         title ='B')+
  theme_classic()+scale_fill_npg()+
  theme(panel.background = element_blank(),
        axis.line.x = element_blank(),
        axis.line.y = element_blank(),
        axis.title.y = element_blank(),
        axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank(),
        legend.title = element_text(),
        plot.title = element_text(hjust = 0.5,vjust=-2,size = 15))+
  labs(fill = 'Subcellular location')


plot_grid(p1,p2,p3)

在R中制作饼图也是十分的简单,但当多组进行比较的时候多个饼图的对比就没那么直观了,这时候我们就需要做堆叠条形图。

[图片上传失败...(image-4ff488-1651203467945)]

堆叠条形图

首先对数据进行前处理做成适合ggplot作图的数据格式,把宽表转换为长表,创建一列组成比例用于后面分割图形。

mdf=df%>%
  pivot_longer(-Subcellar.location,names_to = 'Sample',values_to = 'Value')%>%
  group_by(Sample)%>%
  mutate(Proportion=Value/sum(Value))

geom_bar或是geom_col可以很轻松的做出堆叠条形图。

ggplot(mdf, aes(x = Sample,y=Proportion,fill = Subcellar.location)) +
  geom_col(width = 0.4)+
  theme_base()

[图片上传失败...(image-f09854-1651203467945)]

但为了复现文章中原图的格式,我们调用ggalluvial包中的geom_alluvium或是geom_flow函数来制作桑葚图(冲击图),后面我们会专门对桑葚图(冲击图)进行讲解,这里作为实战应用简单讲解。

g=ggplot(mdf, aes(x = Sample,y=Proportion,fill = Subcellar.location, 
                stratum = Subcellar.location, alluvium = Subcellar.location)) +
  geom_col(width = 0.4,color=NA)+
  geom_flow(width = 0.4,alpha = 0.2,knot.pos = 0)   +#knot.pos可以使连线更直
  #geom_alluvium( width = 0.4,alpha = 0.2,knot.pos = 0)+ 与geom_flow效果相似
  scale_fill_manual(values = pal_npg()(4))+
  theme_map()+
  theme(axis.text.x=element_text(size=20,vjust = 5),
        legend.position = 'none')
g

[图片上传失败...(image-91fcd0-1651203467945)]

原图复现

大体结构已经做出来了,后面就是添加一些连线,强烈建议在AI中修改,只需要几分钟就可以修改好,在R中有几种实现的方法,但总的来说都比较麻烦这里介绍一种,有朋友有好的实现思路也可以在后台留言。一种实现方法就是计算出各节点的坐标然后用geom_segment添加白色线段。

plotv=c()
Name=unique(mdf$Sample)
  for(i in 1:3){#计算条形图上分割线的节点
   data= mdf%>%
     filter(Sample==Name[i])%>%
     arrange(desc(Subcellar.location))
   a=0
   for(j in 1:3){
     a=a+data$Proportion[j]
     plotv=c(plotv,sprintf("geom_segment(aes(x=%d-0.2,y=%f,xend=%d+0.2,yend=%f),color='white',size=2)",i,a,i,a))
   }
  }
g=eval(parse(text = paste0('g+',paste0(plotv,collapse = '+'))))#把线段指令合并输出
g

[图片上传失败...(image-264860-1651203467945)]

subloc=unique(mdf$Subcellar.location)
datalist=list()
for(i in 1:3){
data= mdf%>%
  filter(Sample==Name[i])%>%
  arrange(desc(Subcellar.location))
  a=0
  for(j in 1:4){
    a=a+data$Proportion[j]
    data[j,'y']=a
  }
  datalist[[Name[i]]]=data
}
head(datalist)#增加了y坐标信息,x坐标其实就是所在列的整数加减条形图宽度的一半,这里条形图宽度为0.4,所以x坐标为i±0.2
   

g+geom_segment(aes(x=1.2,y=datalist[['A']]$y[1],xend=1.8,yend=datalist[['B']]$y[1]),color='white',size=2)+
geom_segment(aes(x=1.2,y=datalist[['A']]$y[2],xend=1.8,yend=datalist[['B']]$y[2]),color='white',size=2)+
geom_segment(aes(x=1.2,y=datalist[['A']]$y[3],xend=1.8,yend=datalist[['B']]$y[3]),color='white',size=2)+
geom_segment(aes(x=2.2,y=datalist[['B']]$y[1],xend=2.8,yend=datalist[['C']]$y[1]),color='white',size=2)+
geom_segment(aes(x=2.2,y=datalist[['B']]$y[2],xend=2.8,yend=datalist[['C']]$y[2]),color='white',size=2)+
geom_segment(aes(x=2.2,y=datalist[['B']]$y[3],xend=2.8,yend=datalist[['C']]$y[3]),color='white',size=2)+
theme(axis.title.y = element_text(size=20,angle = 90,vjust =-5),
      legend.position = 'right')

[图片上传失败...(image-8352a0-1651203467945)]

往期内容

  1. (免费教程+代码领取)|跟着Cell学作图系列合集
  2. Q&A | 如何在论文中画出漂亮的插图?
  3. Front Immunol 复现 | 1. GEO数据下载及sva批次校正(PCA可视化)

[图片上传失败...(image-4187cb-1651203467945)]

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容