前几天分析了一批单细胞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. AICompiler动态shape编译框架

    AICompiler动态shape编译框架 移动互联网的兴起,不仅产生了海量数据,也对人机交互有了新的定义.企业如何动态处理不同规格图片数据,如何更灵活处理不同长度的对话语料等等,提升企业运营效率,争 ...

  2. 编译ONNX模型Compile ONNX Models

    编译ONNX模型Compile ONNX Models 本文是一篇介绍如何使用Relay部署ONNX模型的说明. 首先,必须安装ONNX包. 一个快速的解决方案是安装protobuf编译器,然后 pi ...

  3. 在python_request 中 nb-log 日志模块的使用,应用到项目实际使用

    一.安装 pip install nb-log pycham 中安装: 二.基本使用 2.1 pycham中调整设置控制台日志打印出的颜色 2.2 设置完成后去掉console弹出的颜色设置 2.3  ...

  4. 谈谈stream的运行原理

    害,别误会,我这里说的stream不是流式编程,不是大数据处理框架.我这里说的是stream指的是jdk中的一个开发工具包stream. 该工具包在jdk8中出现,可以说已经是冷饭了,为何还要你说?只 ...

  5. jmeter--文件上传和下载

    文件下载 文件下载的method一般是get.本例中导出excel文件. 下载文件如果要求下载到本地,需要另写脚本.采用jsr223或者beashell PostProcessor都可以. 代码如下: ...

  6. 【NX二次开发】获取体是实体还是片体UF_MODL_ask_body_type()

    判断体是实体还是片体:UF_MODL_ask_body_type() //输出 Body type: //UF_MODL_SOLID_BODY 5601 //UF_MODL_SHEET_BODY 56 ...

  7. 29.qt quick-在QML中调用C++类

    1.Qml调用C++类 Qt QML模块提供了一组API,用来将C++类扩展QML中.您可以编写扩展来添加自己的QML类型,扩展现有的Qt类型,或调用无法从普通QML代码访问的C/C++函数本章将学习 ...

  8. Webflux请求处理流程

    spring mvc处理流程 在了解SpringMvc的请求流程源码之后,理解WebFlux就容易的多,毕竟WebFlux处理流程是模仿Servlet另起炉灶的. 下面是spring mvc的请求处理 ...

  9. ffmpeg实战-音视频基础概念

    转发自白狼栈:查看原文 关于音视频,相信大家都看过电影(视频),听过音乐(音频),至少应该都知道mp4是视频文件,mp3是音频文件. 对于一个音视频文件,都有哪些属性呢?以视频为例,我们可以通过 ff ...

  10. Winform中只运行运行一个实例的方法

    在Program类的main方法按如下代码编写即可 1 static void Main() 2 { 3 if (Process.GetProcessesByName(Process.GetCurre ...