前几天分析了一批单细胞TCR的数据,需要画这样一个图:

行是不同的样本,列是不同的T细胞类型,每一个位置点的大小表示T细胞的数目多少,并且还需要根据T细胞所属的克隆型类型涂色。这个图用来描述TCR是我自己构思的,之前没有在文章中见过。好在画图工具是现成的,用的是余老师的scatterpie包。后台回复20210722即可获取本文的测试数据。

1. 导入测试数据

library(tidyverse)
library(scatterpie)
library(reshape2) df1=read.table("test.txt",header = T,row.names = 1,sep = "\t",stringsAsFactors = F)

看一下数据格式

> head(df1)
sample celltype clonal_expansion
TTAGTTCGTTCGGCAC tumor5 E 1
ATAACGCGTGAGGCTA tumor5 A morethan3
CTCTAATCAACACCTA tumor1 B 1
AGACGTTAGTGTGGCA tumor5 A 1
AGATCTGTCACGGTTA tumor5 C 1
TCAGCTCTCGGCGCAT tumor3 A 1 > table(df1$sample,df1$celltype)
A B C D E F G
tumor0 12 60 2 0 21 13 5
tumor1 42 225 65 6 75 59 19
tumor3 44 79 20 4 26 51 6
tumor5 283 134 209 97 23 334 86 > table(df1$clonal_expansion,df1$celltype) A B C D E F G
1 230 485 212 92 128 364 107
2 68 8 28 12 9 54 6
morethan3 83 5 56 3 8 39 3

原始数据框有4个肿瘤样本,7个T细胞类型。

clonal_expansion表示这个T细胞所属的TCR克隆型总共有几个细胞(这几个细胞的TCR克隆型是一样的)

2. 数据转换

长数据转宽数据

df3=df1 %>% dcast(sample+celltype~clonal_expansion)

reshape2包的dcast函数可以将长数据转化为宽数据,

这一步之后,每一行表示在一定的sample、一定的celltype之下,不同的clonal_expansion分组各有多少个值

(默认的整合函数为求和计算)

> head(df3)
sample celltype 1 2 morethan3
1 tumor0 A 12 0 0
2 tumor0 B 60 0 0
3 tumor0 C 2 0 0
4 tumor0 E 19 2 0
5 tumor0 F 13 0 0
6 tumor0 G 5 0 0

除了已知的4个样本,7种类型,我还希望增加一个虚拟样本allsample,一个虚拟类型alltype,1乘4+1乘7+1乘1=12,即还需要人为添加12行

df4a=data.frame()
for (samplei in unique(df3$sample)) {
tmp1=df3 %>% filter(sample == samplei)
df4a=rbind(df4a,c(sample=samplei,celltype="alltype",colSums(tmp1[,3:5])))
} df4b=data.frame()
for (typei in unique(df3$celltype)) {
tmp2=df3 %>% filter(celltype == typei)
df4b=rbind(df4b,c(sample="allsample",celltype=typei,colSums(tmp2[,3:5])))
} df4c=data.frame()
df4c=c(sample="allsample",celltype="alltype",colSums(df3[,3:5])) colnames(df4a)=colnames(df3)
colnames(df4b)=colnames(df3)
df4=rbind(df4a,df4b) %>% rbind(df4c)
df4$`1`=as.numeric(df4$`1`)
df4$`2`=as.numeric(df4$`2`)
df4$morethan3=as.numeric(df4$morethan3)
df5=df3 %>% rbind(df4)

3. 画图

貌似这个R包不支持字符,所以这里我将字符人为转换为数字

df5$sample=ifelse(df5$sample=="tumor0",-1,
ifelse(df5$sample=="tumor1",-2,
ifelse(df5$sample=="tumor3",-3,
ifelse(df5$sample=="tumor5",-4,-5)))) df5$celltype=ifelse(df5$celltype=="A",1,
ifelse(df5$celltype=="B",2,
ifelse(df5$celltype=="C",3,
ifelse(df5$celltype=="D",4,
ifelse(df5$celltype=="E",5,
ifelse(df5$celltype=="F",6,
ifelse(df5$celltype=="G",7,8)))))))

设置配色

library(RColorBrewer)
library(scales)
color_ce=brewer.pal(9, "YlGnBu")[c(3,5,8)]
names(color_ce)=c("1","2","morethan3")

添加一列半径,用每一行细胞数的和映射

df5$radius=log2(rowSums(df5[,3:5])) / 25 #这个公式不唯一,保证细胞多的时候图形大就可以了

以下是画图主要代码:

ggplot() + geom_scatterpie(aes(x=celltype, y=sample, r=radius), data=df5,cols=colnames(df5)[3:5],color=NA) + #cols参数表示用那几列来画扇形
geom_hline(yintercept = -4.5,linetype=5)+
geom_vline(xintercept = 7.5,linetype=5)+
geom_scatterpie_legend(df5$radius, x=3.5, y=-1.3,n=4,labeller = function(x) round(2^(x*25)))+ #n参数表示图例显示几个圆;labeller是一个函数,通过这个函数可以反推出真实数值
coord_equal()+
scale_fill_manual(values = color_ce)+
scale_x_continuous("",expand = c(0,0),breaks = 1:8,labels = c("A","B","C","D","E","F","G","alltype"))+
scale_y_continuous("",expand = c(0,0),breaks = -5:-1,labels = c("allsample","tumor5","tumor3","tumor1","tumor0"))+
theme_bw()+
theme(
panel.grid = element_blank(),
legend.title = element_blank()
)
ggsave("clonal_expansion_pie.pdf",width = 20,height = 15,units = "cm")

之后就能得到封面那张图了。

因水平有限,有错误的地方,欢迎批评指正!

R绘图(7): 把散点图的点换成扇形的更多相关文章

  1. R绘图(1): 在散点图边缘加上直方图/密度图/箱型图

    当我们在绘制散点图的时候,可能会遇到点特别多的情况,这时点与点之间过度重合,影响我们对图的认知.为了更好地反映特征,我们可以加上点的密度信息,比如在原来散点所在的位置将密度用热图的形式呈现出来,再比如 ...

  2. 基础R绘图

    前言: 在前面介绍了R的基础入门语法之后,现也将最近整理好的一些R的基础绘图实例提供给需要的朋友参考.(温馨提示:代码慎用!按照本博文实例进行练习的话最好能做到举一反三.代码多敲方为上策,切不可隔岸观 ...

  3. r绘图基本

    R绘图命令分为三种类型: 高级绘图命令在图形设备上产生一个新的图区,它可能包括坐标轴,标签,标题等等. 低级画图命令会在一个已经存在的图上加上更多的图形元素,例如额外的点,线和标签. 交互式图形命令允 ...

  4. 转:js小技巧 ,将彻底屏蔽鼠标右键,可用于Table ,取消选取、防止复制,IE地址栏前换成自己的图标

    1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键<table border oncontextmenu= ...

  5. 将几何画板x轴坐标值换成弧度制的方法

    大家在学习数学的过程中,都会遇到函数,这个时候大家都会遇到函数图像.对于函数图像我们一般都会通过先建立坐标系,然后让图像呈现在坐标系中.函数的种类有很多,三角函数就是其中之一,在绘制三角函数图像时,我 ...

  6. python txt装换成excel

    工作中,我们需要经常吧一些导出的数据文件,例如sql查出来的结果装换成excel,用文件发送.这次为大家带上python装换excel的脚本 记得先安装wlwt模块,适用版本,python2-3 #c ...

  7. Win8换成Win7系统问题小结(修改主板BIOS方法)

    问题描述: 笔记本电脑W8系统使用不习惯,想要换成W7系统,但不管是用光盘安装亦或是用U盘安装,在设置系统启动项的时候,选择从光盘启动或从U盘启动,但是回车点了之后没反应. 下面就说说问题的原因及解决 ...

  8. php 把数字1-1亿换成汉字表述,例如 150 转成 一百五十

    /* 额,重新修改了下.现在估计没什么问题了.... */ 直接上实例 写到 千亿上了. /** * @author ja颂 * 把数字1-1亿换成汉字表述,如:123->一百二十三 * @pa ...

  9. 【代码笔记】iOS-把<br!>换成\n

    代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // ...

随机推荐

  1. 硬件delay评估表

    硬件delay评估表 硬件延时评估表用于快速评估一个模型在特定硬件环境和推理引擎上的推理速度. Bw 主要用于定义PaddleSlim支持的硬件延时评估表的格式. 概述 硬件延时评估表中存放着所有可能 ...

  2. 摄像头ISP系统原理(中)

    摄像头ISP系统原理(中) AF(FOCUS)----自动对焦 根据光学知识,景物在传感器上成像最清晰时处于合焦平面上.通过更改 LENS 的位置,使得景物在传感器上清晰的成像,是 ISP FOCUS ...

  3. 深度学习Anchor Boxes原理与实战技术

    深度学习Anchor Boxes原理与实战技术 目标检测算法通常对输入图像中的大量区域进行采样,判断这些区域是否包含感兴趣的目标,并调整这些区域的边缘,以便更准确地预测目标的地面真实边界框.不同的模型 ...

  4. gradle 混合编程java、scala、kotlin、groovy

    众所周知,java是基于JVM的开发语言,但能够在JVM上运行的开发语言不仅仅有java,目前还有很热门的kotlin(kotlin不仅仅只能开发Android).scala.groovy等等.目前国 ...

  5. 实验8、31个最重要的Python Flask面试问题和答案

    实验介绍 1. 实验内容 内容涵盖了31个最热门的Flask面试问题,帮助学生更好的理解Flask. 2. 实验要点 了解面试Flask开发人员的常见问题 实验内容 Flask面试问答 Q:Flask ...

  6. 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(基础篇)

    背景 ​ 最近因为要做一个新的管理后台项目,新公司大部分是用vue写的,技术栈这块也是想切到react上面来,所以,这次从0到1重新搭建一个react项目架子,需要考虑的东西的很多,包括目录结构.代码 ...

  7. 微信小程序使用async await的一些技巧

    在小程序onLoad事件中使用getItems(this) 和this.getItems() getItems(this)对应的方法为 this.getItems()对应的方法为 在getItems( ...

  8. ES6、ES7的一些新特性

    1.常见的就是let 和 const 命令 let 只在命令所在的代码块内有效 const声明一个只读的常量 2.变量的赋值 let [a, b, c] = [1, 2, 3]; 这样输出的话a=1, ...

  9. 使用pdb进行Python调试

    调试应用有时是一个不受欢迎的工作,当你长期编码之后,只希望写的代码顺利运行.但是,很多情况下,我们需要学习一个新的语言功能或者实验检测新的方法,从而去理解其中运行的机制原理. 即使不考虑这样的场景,调 ...

  10. 分布式AKF拆分原则

    1. 前言 当我们需要分布式系统提供更强的性能时,该怎样扩展系统呢?什么时候该加机器?什么时候该重构代码?扩容时,究竟该选择哈希算法还是最小连接数算法,才能有效提升性能? 在面对 Scalabilit ...