相信很多人都看到过上面这种方块图,有点像“华夫饼图”的升级版,也有点像“热图”的离散版。我在一些临床多组学的文章里面看到过好几次这种图,用它来展示病人的临床信息非常合适,我自己也用R包或者AI画过类似的图。今天给大家演示一下,如何用ggplot2里面的geom_tile函数画这种图。

先构造一个练习数据集,假设有15个病人,每个病人有年龄、性别、症状、是否有RNA-seq和WES测序等信息。

library(ggplot2)
library(tidyverse)
library(reshape2)
library(RColorBrewer) clinical.df=data.frame(
patient=paste("P",seq(1:15),sep = ""),
age=sample(20:80,15,replace = T),
gander=sample(c("male","female"),15,replace = T),
symptom=sample(c("mild","moderate","severe"),15,replace = T),
RNAseq=sample(c("yes","no"),15,replace = T),
WES=sample(c("yes","no"),15,replace = T)
)

年龄可以看做是连续的,我们进一步分成三个level,最终的数据格式如下:

clinical.df$age=ifelse(clinical.df$age < 40,"level1",
ifelse(clinical.df$age < 60, "level2","level3"))
# head(clinical.df)
# patient age gander symptom RNAseq WES
# 1 P1 level2 female moderate yes yes
# 2 P2 level2 male mild yes yes
# 3 P3 level2 female mild no no
# 4 P4 level1 male severe no yes
# 5 P5 level2 male mild yes no
# 6 P6 level3 female moderate no yes

在使用geom_tile画方块图之前,需要将宽数据转换为长数据,使用到reshape2中的melt函数

clinical.df2=melt(clinical.df,id="patient")
# head(clinical.df2)
# patient variable value
# 1 P1 age level2
# 2 P2 age level2
# 3 P3 age level2
# 4 P4 age level1
# 5 P5 age level2
# 6 P6 age level3

接下来,为了自定义图形横纵轴变量的顺序,可以人为定义因子变量,并指定因子的level。(这种方法在实际画图中,经常用到)

clinical.df2$patient=factor(clinical.df2$patient,levels = paste("P",seq(1:15),sep = ""))
clinical.df2$variable=factor(clinical.df2$variable,levels = c("WES","RNAseq","symptom","gander","age"))

然后是自定义颜色,创建一个命名的字符串向量,表示颜色的字符串都是通过R包RColorBrewer查询的,可以参考我之前的一篇笔记:ColorBrewer配色方案

cols=c(
"level1"="#E5F5E0","level2"="#A1D99B","level3"="#41AB5D",
"male"="#66C2A5","female"="#FC8D62",
"mild"="#377EB8","moderate"="#FFFF33","severe"="#E41A1C",
"yes"="black","no"="lightgrey"
)

最后开始画图

clinical.df2%>%ggplot(aes(x=patient,y=variable))+
geom_tile(aes(fill=value),color="white",size=1)+ #color和size分别指定方块边线的颜色和粗细
scale_x_discrete("",expand = c(0,0))+ #不显示横纵轴的label文本;画板不延长
scale_y_discrete("",expand = c(0,0))+
scale_fill_manual(values = cols)+ #指定自定义的颜色
theme(
axis.text.x.bottom = element_text(size=10),axis.text.y.left = element_text(size = 12), #修改坐标轴文本大小
axis.ticks = element_blank(), #不显示坐标轴刻度
legend.title = element_blank() #不显示图例title
)
ggsave("tmp.pdf",device = "pdf",width = 21,height = 7,units = "cm")

图中右侧的图例并不是我们想要的,这时还需要用AI稍微编辑一下,最后的效果如下:


关于ggplot2的学习,我之前整理了几篇笔记,感兴趣的小伙伴可以点击下面的链接进行阅读

ggplot2回顾(1): 认识ggplot2

ggplot2回顾(2): 图层语法入门

ggplot2回顾(3): 图层语法基础

ggplot2回顾(4): 瓦片图、多边形图

ggplot2回顾(5): 数据分布的展示

ggplot2回顾(6): ColorBrewer配色方案

ggplot2回顾(7): geom_bar()和 geom_histogram()比较

ggplot2回顾(8): 标度

ggplot2回顾(9): 分面

ggplot2回顾(10): 坐标系

ggplot2回顾(11): 主题设置

ggplot2回顾(12): 一页多图

ggplot2回顾(13): 使用plyr包整理数据

ggplot2回顾(14): 绘图函数--以平行坐标图为例

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

R绘图(2): 离散/分类变量如何画热图/方块图的更多相关文章

  1. r绘图基本

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

  2. 含有分类变量(categorical variable)的逻辑回归(logistic regression)中虚拟变量(哑变量,dummy variable)的理解

    版权声明:本文为博主原创文章,博客地址:,欢迎大家相互转载交流. 使用R语言做逻辑回归的时候,当自变量中有分类变量(大于两个)的时候,对于回归模型的结果有一点困惑,搜索相关知识发现不少人也有相同的疑问 ...

  3. 用R包中heatmap画热图

    一:导入R包及需要画热图的数据 library(pheatmap) data<- read.table("F:/R练习/R测试数据/heatmapdata.txt",head ...

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

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

  5. seaborn(2)---画分类图/分布图/回归图/矩阵图

    二.分类图 1. 分类散点图 (1)散点图striplot(kind='strip') 方法1: seaborn.stripplot(x=None, y=None, hue=None, data=No ...

  6. R数据分析:二分类因变量的混合效应,多水平logistics模型介绍

    今天给大家写广义混合效应模型Generalised Linear Random Intercept Model的第一部分 ,混合效应logistics回归模型,这个和线性混合效应模型一样也有好几个叫法 ...

  7. R数据分析:纵向分类结局的分析-马尔可夫多态模型的理解与实操

    今天要给大家分享的统计方法是马尔可夫多态模型,思路来源是下面这篇文章: Ward DD, Wallace LMK, Rockwood K Cumulative health deficits, APO ...

  8. 基础R绘图

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

  9. R语言-探索多个变量

    目的: 通过探索文件pseudo_facebook.tsv数据来学会多个变量的分析流程 通过探索diamonds数据集来探索多个变量 通过酸奶数据集探索多变量数据 知识点: 散点图 dplyr汇总数据 ...

随机推荐

  1. java集合类(新手也能掌握)

    文章目录 1.集合概述 (1)集合: (2)集合分类: 2.Collection接口 3.List接口 (1)List接口简介 (2)ArrayList集合 (3)LinkedList集合 (4)It ...

  2. PyQt(Python+Qt)学习随笔:QScrollArea为什么不起作用未出现滚动条?

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 老猿在进行Scroll Area部件测试时,在下面的窗体中放置了一个Scroll Area部件,在部 ...

  3. 第11.20节 Python 中正则表达式的扩展功能:后视断言、后视取反

    一. 引言 在<第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反>中老猿介绍了前视断言和前视取反,与二者对应的还有后视断言和后视取反. 二. (?<=-)后视 ...

  4. Python学习随笔:使用xlwings读取和操作Execl文件

    一.背景 有2种模块可以对Execl文件,一种是xlwt 方式,需要安装三个库文件 xlrd(读Excel)xlwt(写Excel)xlutils(修改Excel),也是网上介绍文章最多的一种方法,一 ...

  5. secret_key伪造session来进行越权

    从swpuctf里面的一道ctf题目来讲解secret_key伪造session来进行越权. 以前没有遇到过这种题目,这次遇到了之后查了一些资料把它做了出来,记录一下知识点. 参考资料 http:// ...

  6. Mac开发必设置的Finder设置项,你设置了吗?

    1.显示标签页.显示路径栏.显示状态栏的设置位置,在访达->显示-> 显示状态栏 个人三个都设置了,但是觉得显示状态栏用的并不多,反而多一行,下面是显示状态栏的效果,主要可以一眼看出有多少 ...

  7. 软工个人项目 ——wc.exe

    1.GitHub项目地址 https://github.com/k8kiw/WordCount 2.PSP预计时间 PSP2.1 Personal Software Process Stages 预估 ...

  8. PostgreSQL 如何忽略事务中错误

    在 PostgreSQL 的事务中:执行的SQL遇到错误(书写,约束限制):该事务的已经执行的SQL都会进行rollback.那如何忽略其中的错误.将SQL执行到底?在事务中设置 ON_ERROR_R ...

  9. ip 子网掩码、网络地址、广播地址计算

    例:已知ip  16.158.165.91/22子网掩码 根据22 得知子网掩码占22位 即:11111111.11111111.11111100.00000000   == 255.255.252. ...

  10. 题解 CF1428G Lucky Numbers (Easy Version and Hard Version)

    这题没有压行就成 \(\texttt{Hard Version}\) 最短代码解了( 要知道这题那么 \(sb\) 就不啃 \(D\) 和 \(E\) 了. \(\texttt{Solution}\) ...