草庐IT

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

木舟笔记 2023-03-28 原文
桑葚图.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)]

有关跟着 Cell 学作图 | 桑葚图(ggalluvial)的更多相关文章

  1. javascript - 谷歌电子表格 : Encrypt cell content with Google Apps Script - 2

    我有一个谷歌电子表格,想加密几个单元格的内容(只要有适用于iOS的等效解密方法,我不在乎使用哪种加密方法)。不幸的是,GoogleAppsScript中没有内置的加密功能。出于这个原因,我想使用像Crypto-JS这样的开源Javascript库。和sjcl.如何将这些库之一与GoogleAppsScript结合使用?在GoogleAppsScript文档中,我没有找到任何关于如何在我的GoogleAppsScript中使用外部JavaScript库的线索。 最佳答案 好吧,我会这么说,因为这是我在DateJS中使用的方法。.您可以

  2. Javascript, 火狐 : how to disable the browser specific cell controls? - 2

    在Firefox中:当将光标置于表格单元格中时,浏览器将显示4个控件(一个位于每个单元格边框的中间)。(内容处于可编辑模式。)如何禁用这些内容?提前致谢。 最佳答案 如果您指的是在可编辑表格上获得的控件,则可以使用以下命令禁用这些控件。它适用于最近的Firefox,至少:document.execCommand("enableInlineTableEditing",null,false); 关于Javascript,火狐:howtodisablethebrowserspecificcel

  3. javascript - 在 Arcgis map 上添加 Json 操作图层信息 - 2

    我尝试从以下JSON加载操作层数据,但没有成功。到目前为止,我尝试了以下方法使用graphicLayer=newesri.layers.GraphicsLayer();将其添加为图形层;graphicLayer.add(json);map.add(graphicLayer);尝试对其进行规范化并使用normalizeUtils.normalizeCentralMeridian添加为图形有没有我遗漏的东西,供引用我正在尝试按照这个例子http://resources.arcgis.com/en/help/arcgis-web-map-json/index.html#/ArcGIS_fea

  4. javascript - 如何更改 jquery .toggle() 以使用显示 :table-cell? - 2

    我正在使用jquery.toggle()在页面上显示一个div,该页面在页面加载时显示为无。但是,在默认设置下,jquery会插入display:block,我希望在其中显示:table-cell。我怎样才能做到这一点?到目前为止我的尝试:test.mydiv{display:table-cell;}$("a#showdiv").click(function(){$(".mydiv").toggle(); 最佳答案 使用.toggleClass()而是使用css进行样式设置..htmltestCSS.mydiv{display:ta

  5. javascript - 再次单击浏览器操作图标以关闭 Chrome 扩展程序弹出窗口 - 2

    我正在开发一个Chrome扩展程序,我想知道是否可以通过再次单击允许您打开弹出窗口的图标来关闭弹出窗口:我尝试了任何方法,但看起来您必须单击其他地方才能关闭它.文档指出onClicked事件是:单击浏览器操作图标时触发。如果浏览器操作有弹出窗口,则不会触发此事件(http://developer.chrome.com/extensions/browserAction.html#popups)。提前致谢。[更新]我尝试了以下方法,它成功了一半(!):1.在popup.html中链接popup.js;2.popup.js读取background.js中包含的一个变量的值;varcurren

  6. javascript - jqGrid gridComplete :- getRowData - get row cell value from array - 2

    Please-needsyntaxforsettingvariablesfromjqGridgetRowDataproperty遍历行-只需将ID和Phrase列值拉入变量gridComplete:function(){varallRowsInGrid=$('#list').jqGrid('getRowData');for(i=0;iView";}},能够使用getDataIDs轻松获取ID:-)需要帮助获取pid和vPhrasefori的特定列值干杯 最佳答案 试试这个:varids=jQuery("#list").jqGrid(

  7. javascript - semantic-ui-react <Responsive> 不适用于 <Table.Cell> - 2

    我正在使用semantic-uireact来呈现数据表。我的要求是当页面在移动View上时,我隐藏某些列。我尝试在Table.Cell元素上使用className="mobilehidden"但这似乎根本不起作用。然后我尝试使用如下所示的Responsive组件,但出现错误。我在这里错过了什么吗?找不到其他人有这个问题......{record.datapoint}调整窗口大小时,我在控制台中收到此错误...index.js:2177Warning:Canonlyupdateamountedormountingcomponent.Thisusuallymeansyoucalledset

  8. excel - Golang Excelize : how to set cell value with row nmber and column number - 2

    我正在尝试编写一个函数,该函数使用Excelize编写一个字符串数组以在Go中表现出色。我的问题:如何使用行号和列号来处理单元格,而不是“axis”参数的“A1”语法类型?//Writestheheaderofthefile:xlfile.SetCellValue("Sheet1","A1","1")//Insteadof"A1",Iwouldliketouserownumberandcolnumberasparameters 最佳答案 CoordinatesToCellName将[X,Y]坐标转换为字母数字单元格名称或返回错误。

  9. 时间:2019-01-08 标签:c#winforms : DataGridView leave event not getting value of last updated cell - 2

    我有一个WinForms屏幕,上面有一个DataGridView和后退/下一步按钮。在FormLoad上,网格中填充了来自XML文档的值。然后用户可以更改网格中任何单元格的值。我创建了一个SaveGridValuesToXml方法,它使用来自网格单元格的更新值更新XML文件。这大部分工作正常,我已经从网格上的Leave事件触发了SaveGridValuesToXml方法,因此当用户单击后退或下一步并且网格失去焦点时,将调用保存方法。我遇到的问题是,除了在网格失去焦点时获得焦点的单元格之外,所有单元格值都已更新并正确反射(reflect)在XML文件中。例如,在三列网格中,如果我更新第一

  10. xml - LibreOffice Calc "office:value-type"标签中存在哪些类型的 "calcext:value-type"和 "table:table-cell"属性? - 2

    我正在用python代码构建LibreOfficeCalc文件,我想找到我可以使用的所有类型的“office:value-type”和“calcext:value-type”属性(例如“string”、“float”","int"-我不确定这就是全部)。谢谢!附言请提供文档主题链接,我似乎找不到任何合适的相关Material。 最佳答案 http://docs.oasis-open.org/office/v1.2/cd05/OpenDocument-v1.2-cd05-part1.html#a_19_387_office_value

随机推荐