R绘图(7): 把散点图的点换成扇形
前几天分析了一批单细胞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): 把散点图的点换成扇形的更多相关文章
- R绘图(1): 在散点图边缘加上直方图/密度图/箱型图
当我们在绘制散点图的时候,可能会遇到点特别多的情况,这时点与点之间过度重合,影响我们对图的认知.为了更好地反映特征,我们可以加上点的密度信息,比如在原来散点所在的位置将密度用热图的形式呈现出来,再比如 ...
- 基础R绘图
前言: 在前面介绍了R的基础入门语法之后,现也将最近整理好的一些R的基础绘图实例提供给需要的朋友参考.(温馨提示:代码慎用!按照本博文实例进行练习的话最好能做到举一反三.代码多敲方为上策,切不可隔岸观 ...
- r绘图基本
R绘图命令分为三种类型: 高级绘图命令在图形设备上产生一个新的图区,它可能包括坐标轴,标签,标题等等. 低级画图命令会在一个已经存在的图上加上更多的图形元素,例如额外的点,线和标签. 交互式图形命令允 ...
- 转:js小技巧 ,将彻底屏蔽鼠标右键,可用于Table ,取消选取、防止复制,IE地址栏前换成自己的图标
1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键<table border oncontextmenu= ...
- 将几何画板x轴坐标值换成弧度制的方法
大家在学习数学的过程中,都会遇到函数,这个时候大家都会遇到函数图像.对于函数图像我们一般都会通过先建立坐标系,然后让图像呈现在坐标系中.函数的种类有很多,三角函数就是其中之一,在绘制三角函数图像时,我 ...
- python txt装换成excel
工作中,我们需要经常吧一些导出的数据文件,例如sql查出来的结果装换成excel,用文件发送.这次为大家带上python装换excel的脚本 记得先安装wlwt模块,适用版本,python2-3 #c ...
- Win8换成Win7系统问题小结(修改主板BIOS方法)
问题描述: 笔记本电脑W8系统使用不习惯,想要换成W7系统,但不管是用光盘安装亦或是用U盘安装,在设置系统启动项的时候,选择从光盘启动或从U盘启动,但是回车点了之后没反应. 下面就说说问题的原因及解决 ...
- php 把数字1-1亿换成汉字表述,例如 150 转成 一百五十
/* 额,重新修改了下.现在估计没什么问题了.... */ 直接上实例 写到 千亿上了. /** * @author ja颂 * 把数字1-1亿换成汉字表述,如:123->一百二十三 * @pa ...
- 【代码笔记】iOS-把<br!>换成\n
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // ...
随机推荐
- 为x86 CPU自动调度神经网络
为x86 CPU自动调度神经网络 对特定设备和工作负载进行自动调试对于获得最佳性能至关重要.这是有关如何使用自动调度器为x86 CPU调试整个神经网络的文档. 为了自动调试神经网络,将网络划分为小的子 ...
- TinyML-TVM是如何驯服Tiny的(下)
TinyML-TVM是如何驯服Tiny的(下) Lazy Execution实际上,随着通信开销开始占主导地位,一旦用户请求,就执行算子的开销变得非常昂贵.可以通过延迟评估直到用户需要调用的结果来提高 ...
- 基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化
基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化 Optimizing NVIDIA TensorRT Conversion for Real-time Inference on Auto ...
- Json文件解析(下)
Json文件解析(下) 代码地址:https://github.com/nlohmann/json 从STL容器转换 任何序列容器(std::array,std::vector,std::dequ ...
- 硬核!2w 字长文爆肝分布式事务知识点!!
前言 分布式事务,是分布式架构中一个绕不开的话题,而什么是分布式事务?为什么要使用分布式事务?分布式事务有哪些实现方案?更是面试时面试官特别喜欢的一个分布式三连炮!同时用XMind画了一张导图记录分布 ...
- 错误档案1:Eclipse自动生成swing窗体代码报错
目录 前言 错误信息 解决方法 结论 前言 大家好呀,我是 白墨,一个热爱学习与划水的矛盾体. 昨天为了图方便,使用MyEclipse中的swing功能画界面,画完以后发现无法运行,查看源代码发现全报 ...
- 日常Bug排查-Nginx重复请求?
日常Bug排查-Nginx重复请求? 前言 日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,其中不乏一些看起来很低级但很容易犯的问题. 问题现场 有一天运维突然找到 ...
- 九、部署audit监控文件
审计的目的是基于事先配置的规则生成日志,记录可能发生在系统上的事件(正常或非正常行为的事件),审计不会为系统提供额外的安全保护,但她会发现并记录违反安全策略的人及其对应的行为. 审计能够记录的日志内容 ...
- Swapon交换空间: 缓解真实物理内存的压力
交换空间: 缓解真实物理内存的压力 交换空间: 缓解真实物理内存的压力 由硬盘的空间来组成 – 交换分区:以空闲分区充当的交换空间 1.格式化交换分区 [root@server0 /]# mkswap ...
- Spring Bean 的生命周期总结
除了使用阶段外,Spring 将 bean 的生命周期定义为实例化.属性填充.初始化和销毁四个阶段,并为每个阶段提供了多个拓展点用于自定义 bean 的创建过程.这篇文章介绍了 bean 的生命周期和 ...