相信很多人都看到过上面这种方块图,有点像“华夫饼图”的升级版,也有点像“热图”的离散版。我在一些临床多组学的文章里面看到过好几次这种图,用它来展示病人的临床信息非常合适,我自己也用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. MySQL对数据 对表 对数据操作

    ------------恢复内容开始------------ MySQL 数据库的操作 创建 create database 数据库名; 指定字符集 create database 数据库名 char ...

  2. PyQt(Python+Qt)学习随笔:视图中的拖放操作注意事项

    老猿Python博文目录 老猿Python博客地址 在通过PyQt构建的图形界面中进行拖放,要成功进行拖放需要注意: 视图相关属性需要支持拖放,具体相关属性请参考<PyQt(Python+Qt) ...

  3. Docker 命令自动补全?要的

    前言 不知道这个小伙伴有多久没用过 Docker 了, 突然对我说 Docker 命令怎么发生变化了 docker run ... #变成了 docker container run ... 他说,本 ...

  4. SQL直接生成实体属性,简单粗暴型

    在java开发中,不可避免的要碰到根据表生成对应的实体,这个过程是比较机器且繁琐的,我也用过一些逆向工程的工具,比如IDEA自带的生成实体,还有网上开源的工具,用起来也是可以的. 我现在开发用的持久层 ...

  5. AGC039D 题解

    题目描述 给定在笛卡尔坐标系的单位圆上的\(N\)个点(圆心为\((0, 0)\)).第\(i\)个点的坐标为\((cos(\frac{2 \pi T_i}{L}), sin(\frac{2 \pi ...

  6. hash相关

    转译☞:https://www.cs.rice.edu/~as143/COMP441_Spring17/scribe/lect4.pdf 1 大规模图片检索问题 基于树模型的算法在分类跟聚类中很受欢迎 ...

  7. Java集合源码分析(六)——ConcurrentHashMap

    目录 简介 源码分析 父类 接口 字段 内部类 1.链表节点结构 2.树根结构 3.树节点结构 方法 1.构造方法 2.基本并发方法 3.初始化表数组的操作 4.修改添加元素 5.统计元素数量 6.扩 ...

  8. 算法——寻找第K个最大的数

    在未排序的数组中找到第 k 个最大的元素. 链接: leetcode. 解题思路:通过快速排序的思想方法,每次随机获取指定范围内一个树的排序位置,然后根据这个位置,再重新指定范围,直到这个位置索引满足 ...

  9. nginx学习之——CentOS6.0下安装nginx

    1.下载对应nginx版本 #注:下载地址:http://nginx.org/download/ wget -c http://nginx.org/download/nginx-1.10.3.tar. ...

  10. WinUI 3 Preview 3 发布了,再一次试试它的性能

    1. WinUI 3 在微软 Build 2020 开发者大会上,WinUI 团队宣布可公开预览的 WinUI 3 Preview 1,它让开发人员可以在 Win32 中使用 WinUI.最终 XAM ...