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

先导入数据,除了ggplot2,还有一个ggExtra包

library(ggplot2)
library(tidyverse)
library(ggExtra)
df=read.table("20191126P31_HTODemux_CiteFuse.txt",header = T,row.names = 1,sep = "\t",stringsAsFactors = F) #数据格式如下
# head(df)
# HTODemux tag2 tag3 CiteFuse
# AAACCCAAGTCATACC doublet 6323 1582 doublet
# AAACCCAAGTTGTCGT tag3 17 3760 tag3
# AAACCCACATGAGAAT tag3 32 2614 tag3
# AAACCCAGTAACTGCT tag3 30 699 tag3
# AAACCCAGTACCAGAG tag2 4425 60 tag2
# AAACCCAGTACGATGG tag3 40 8043 tag3 #每一组的占比,可以放在图的右上角
group_labels=paste("tag2: 0.3844",
"tag3: 0.5000",
"doublet: 0.0844",
"negative: 0.0312",sep = "\n")

原图的绘制

p=df%>%ggplot(aes(x=log(tag2),y=log(tag3),color=CiteFuse))+geom_point(size=2)+
annotate("text",x=11,y=11,label=group_labels,color="black",size=6)+ #注释类型为“文本”类型,位置在x=11,y=11的位置,这张图横纵轴大约为12,因此(11,11)大概在右上角的地方
scale_x_continuous("tag2_UMI_ln",breaks = seq(0,12,2))+
scale_y_continuous("tag3_UMI_ln",breaks = seq(0,12,2))+
theme_bw()+
theme(
axis.text.x.bottom = element_text(size = 16), #下面两行调整坐标轴刻度的文本大小
axis.text.y.left = element_text(size = 16),
axis.title.x = element_text(size = 18), #下面两行调整坐标轴title的文本大小
axis.title.y = element_text(size = 18),
legend.text = element_text(size = 18), #下面两行调整图例文本大小
legend.title = element_text(size = 18),
legend.position = c(0.9,0.1), #图例的位置,(0.9,0.1)是一个相对坐标,假设横纵轴长为1
legend.key = element_blank(), #下面两行将图例的底层去掉,因为是白色的,所以去不去看不出来,只有在AI编辑图片的时候才能看到
legend.background = element_blank(),
panel.grid.major = element_blank(), #下面两行将图中ggplot2默认的横线竖线去掉
panel.grid.minor = element_blank()
)
pdf("raw.pdf",width = 10, height = 10)
p
dev.off()



密度图可以用smoothScatter()绘制

pdf("smoothScatter.pdf",width = 7, height = 7.5)
smoothScatter(log(df$tag2),log(df$tag3),xlab="tag2_UMI_ln",ylab="tag3_UMI_ln")
dev.off()



这种密度图还是比较常用的,不过在此处与原图相比,失去了分组信息,有点顾此失彼。我们看一下另一种方案,主要用到的就是ggExtra包里面的ggMarginal()函数。

p1=ggMarginal(p, type="histogram", fill = "lightblue", xparams = list(bins=40), yparams = list(bins=40))
pdf("histogram.pdf",width = 10, height = 10)
p1
dev.off()

xparams和yparams分别用来调整两个方向的参数,这里我只调整了bin的数量,即每一个方向有40个柱形。

p2=ggMarginal(p, type="density", fill="lightgrey", color="lightgrey")
pdf("density.pdf",width = 10, height = 10)
p2
dev.off()

fill和color分别调整填充颜色和边的颜色

p3=ggMarginal(p, type="boxplot", size=7, xparams = list(color="black",size=1), yparams = list(color="grey",size=1))
pdf("boxplot.pdf",width = 10, height = 10)
p3
dev.off()

size=7表示主图长/宽是附图的7倍,list()里面的size表示箱型图边的宽窄

p4=ggMarginal(p, type="densigram",fill="lightblue",color="purple")
pdf("densigram.pdf",width = 10, height = 10)
p4
dev.off()

最后一个图是直方图和密度图的组合


针对我给出的原图,在主图的边缘加密度图看上去是不错的选择,感兴趣的小伙伴可以试试看~

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

R绘图(1): 在散点图边缘加上直方图/密度图/箱型图的更多相关文章

  1. 06. Matplotlib 2 |折线图| 柱状图| 堆叠图| 面积图| 填图| 饼图| 直方图| 散点图| 极坐标| 图箱型图

    1.基本图表绘制 plt.plot() 图表类别:线形图.柱状图.密度图,以横纵坐标两个维度为主同时可延展出多种其他图表样式 plt.plot(kind='line', ax=None, figsiz ...

  2. matplotlib柱状图、面积图、直方图、散点图、极坐标图、箱型图

    一.柱状图 1.通过obj.plot() 柱状图用bar表示,可通过obj.plot(kind='bar')或者obj.plot.bar()生成:在柱状图中添加参数stacked=True,会形成堆叠 ...

  3. Python图表数据可视化Seaborn:2. 分类数据可视化-分类散点图|分布图(箱型图|小提琴图|LV图表)|统计图(柱状图|折线图)

    1. 分类数据可视化 - 分类散点图 stripplot( ) / swarmplot( ) sns.stripplot(x="day",y="total_bill&qu ...

  4. R语言-箱型图&热力图

    1.箱型图 boxplot()函数 > metals<-read.csv("metals.csv",header=TRUE) #读取文件和列名 > boxplot ...

  5. seaborn分类数据可视化:散点图|箱型图|小提琴图|lv图|柱状图|折线图

    一.散点图stripplot( ) 与swarmplot() 1.分类散点图stripplot( ) 用法stripplot(x=None, y=None, hue=None, data=None, ...

  6. R & ggplot2 & Excel绘图(直方图/经验分布图/QQ图/茎叶图/箱线图)实例

    持续更新~ 散点图 条形图 文氏图 饼图 盒型图 频率直方图 热图 PCA图 3D图 火山图 分面图 分面制作小多组图 地图 练习数据: year count china Ame jap '12 2. ...

  7. R画散点图、线型图、箱型图、直方图基本知识

    1.导入数据 2.散点图 plot(iris[,1]~iris[,4],xlab='Length',ylab='Width',col='red',main='Length VS Width')

  8. R绘图(7): 把散点图的点换成扇形

    前几天分析了一批单细胞TCR的数据,需要画这样一个图: 行是不同的样本,列是不同的T细胞类型,每一个位置点的大小表示T细胞的数目多少,并且还需要根据T细胞所属的克隆型类型涂色.这个图用来描述TCR是我 ...

  9. 利用R求分位数及画出箱型图

    1)数据集 data<-c(75.0,64.0,47.4,66.9,62.2,62.2,58.7,63.5,66.6,64.0,57.0,69.0,56.9,50.0,72.0) 默认是四分位: ...

随机推荐

  1. Redis分布式锁—SETNX+Lua脚本实现篇

    前言 平时的工作中,由于生产环境中的项目是需要部署在多台服务器中的,所以经常会面临解决分布式场景下数据一致性的问题,那么就需要引入分布式锁来解决这一问题. 针对分布式锁的实现,目前比较常用的就如下几种 ...

  2. 基于CefSharp开发(一)开发什么?没想好

    一.创建项目 创建WPF (.Net Core)项目 二.CefSharp引用 程序包管理器控制台引入CefSharp Install-Package CefSharp.Wpf -Version 85 ...

  3. 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析

    第7.17节  Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析 静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供. 一 ...

  4. PyQt(Python+Qt)学习随笔:QTableWidgetItem项的复选状态checkState访问方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget表格部件中的QTableWidgetItem项可以单独设置复选状态,如图所有 ...

  5. 问题:PyCharm调试方法Force Step over与step over的区别

    Force Step over与step over的差别是,后者在执行到函数时,如果函数中设置了断点,会在该函数断点处暂停,等待进一步调试指令,而Force Step over不论函数中是否有断点,都 ...

  6. 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解

    PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...

  7. Jenkins环境搭建(8)-邮件未能正常发送

    昨天,在使用jenkins构建项目时,出现了个问题,问题是:jenkins控制台日志显示邮件发送成功,但实际没有成功. 此前,jenkins的配置,项目构建后,是能正常发送邮件的,可这次突然就不行了, ...

  8. NameSilo的DDNS动态域名解析

    用Java写的,一个实时检测IP变化并更新DNS状态的工具,适用于在NameSilo购买的域名,如果你的域名是在其他商家购买的,修改为你自己的api就行.代码我放github了,地址: https:/ ...

  9. vue2中$emit $on $off实现组件之间的联动,绝对有你想了解的

    在vue2开发中,你肯定会遇到组件之间联动的问题,现在我们就来说说哪个神奇的指令可以满足我们的需求. 一.先上实例: 需求:点击A组件或者B组件可以使C组件的名称相应发生改变,同样,点击A组件也会使对 ...

  10. 11g rac关闭、开启(顺序)

    1.关闭数据库(oracle) srvctl stop database -d rac 2.关闭集群(root) /u01/app/11.2.0/grid/bin/crsctl stop cluste ...