查看: 1040|回复: 12

[R语言] 介绍一种个性化热图的绘制方法

  [复制链接]
  • TA的每日心情
    忙~
    2019.12.2 17:10
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    管理员

    Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

    主题
    108
    奥币
    892
    积分
    941
    注册时间
    2019.7.8
    在线时间
    175 小时

    发表于 2020.3.19 10:08:51 | 显示全部楼层 |阅读模式
    在我们的一篇客户文章的GO/KEGG富集分析部分有这样一类热图(如下),通过改变颜色条的映射方式,以0.05为分界,非常巧妙地实现对Q值(也可以是P值)的可视化展示,直观展示出感兴趣通路在不同比较组的富集情况。

    (genes,2019)

    绘制这样的热图,有两个关键的步骤:颜色条的控制和分组信息的添加。接下来,就为大家介绍如何使用R语言的pheatmap包绘制这样的图表。

    #安装pheatmap包;
    #install.packages("pheatmap")

    #加载R包;
    library(pheatmap)

    #查看当前目录的文件;
    dir()数据准备

    这里用到的范例数据为基迪奥结题报告中GO富集分析的结果,范例数据可以在以下链接中下载:https://www.omicshare.com/forum/thread-5965-1-1.html
    数据的格式如下:


    #读入数据;
    df<-read.table("qv.go.xls",header = T,sep = "\t")

    #热图数据准备:提取数据的3~8列;
    dt<-df[,3:8]

    #分组信息数据框生成;
    annotation<-data.frame(Type=as.vector(df[,1]))

    #数据框的行名获取;
    rowname<-as.vector(df[,2])

    #用原表的第二列数据替换两个数据框的行名;
    row.names(dt)<-rowname
    row.names(annotation)<-rowname

    热图绘制

    #初始效果尝试,不对数据做聚类和归一化;
    p<-pheatmap(dt,cluster_rows=F,cluster_cols=F)
    p


    #显示数据;
    #fontsize_number设置数字大小,number_color设置数据颜色;
    #主要对横轴标签的方向,字体的大小做调整;

    p1<-pheatmap(dt,cluster_rows=F,cluster_cols=F,
                 display_numbers=T,number_format="%.3f",
                 border="white",
                 fontsize_number=7,
                 fontsize_col = 8,
                 fontsize_row = 8,
                 angle_col = 90)
    p1


    #调整热图的颜色条的刻度和标签;

    p2<-pheatmap(dt,cluster_rows=F,cluster_cols=F,
                 display_numbers=T,number_format="%.3f",
                 border="white",
                 fontsize_number=7,
                 fontsize_col = 8,
                 fontsize_row = 8,
                 angle_col = 90,
                 legend_breaks=c(0.05,0.25,0.5,0.75,0.95),
                 legend_labels=c("0.05","0.25","0.5","0.75","0.95"))
    p2


    颜色调整

    colorRampPalette()函数中的bias参数虽然能改变中间颜色的偏移(比如bias>1时,中间颜色向下偏移),如下。但这种方式并不能进行精确对应到0.05的值,只能不断调整数值,去预估位置。

    colors = colorRampPalette(c("royalblue", "white","pink","tomato"),bias=3)(100)

    当然,还可以用较为“精确”的方式,手工调整不同颜色的数量比例(如这里的5种颜色与≤0.05的Q值对应),让数据与颜色建立映射关系。如果觉得颜色数少,颜色的数量可以翻倍。

    mycoldown<-colorRampPalette(c("green","white"))(5)
    mycolup<-colorRampPalette(c("white","pink","tomato"))(95)
    mycol<-c(mycoldown,mycolup)

    p3<-pheatmap(dt,cluster_rows=F,cluster_cols=F,
                 display_numbers=T,number_format="%.3f",
                 border="white",
                 fontsize_number=7,
                 fontsize_col = 8,
                 fontsize_row = 8,
                 angle_col = 90,
                 legend_breaks=c(0.05,0.25,0.5,0.75,0.95),
                 legend_labels=c("0.05","0.25","0.5","0.75","0.95"),
                 color = mycol)
    p3


    添加分组信息

    这里主要用到annotation_row这个参数。

    p4<-pheatmap(dt,cluster_rows=F,cluster_cols=F,
                 display_numbers=T,number_format="%.3f",
                 border="white",
                 fontsize_number=7,
                 fontsize_col = 8,
                 fontsize_row = 8,
                 angle_col = 90,
                 legend_breaks=c(0.05,0.25,0.5,0.75,0.95),
                 legend_labels=c("0.05","0.25","0.5","0.75","0.95"),
                 color = mycol,
                 annotation_row=annotation)
    p4


    图例大小调整

    pheatmap并没有专门的图例大小调整参数,不过可以通过fontsize调整字体的大小,进而调整图例的比例,很神奇的样子!当然你也可以导出矢量图,后期在Ai软件中调整。

    p5<-pheatmap(dt,cluster_rows=F,cluster_cols=F,
                 display_numbers=T,number_format="%.3f",
                 border="white",
                 fontsize_number=7,
                 fontsize_col = 8,
                 fontsize_row = 8,
                 angle_col = 90,
                 legend_breaks=c(0.05,0.25,0.5,0.75,0.95),
                 legend_labels=c("0.05","0.25","0.5","0.75","0.95"),
                 color = mycol,
                 fontsize=6,
                 annotation_row=annotation)
    p5


    最后,如果不喜欢分组信息的的标记颜色,可以通过annotation_colors这个参数调整,满意后,使用filename这个参数导出图片即可。

    关于R语言还有很多内容值得钻研学习,对R语言感兴趣的老师同学们可以前往我们Omicshare在线课堂观看系列课程。



    视频观看方式

    电脑端:登录Omicshare课堂www.omicshare.com/class观看学习
    手机端:通过点击基迪奥微信公众号底部菜单栏【视频教程】观看学习

    今天的内容就到这里啦~

    参考文献
    Ding J, Zhao J, Pan T, et al. Comparative Transcriptome Analysis of Gene Expression Patterns in Tomato Under Dynamic Light Conditions[J]. Genes, 2019, 10(9): 662.



    本文作者:基迪奥-莫北

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    回复

    使用道具 举报

  • TA的每日心情

    昨天 22:13
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    29
    积分
    33
    注册时间
    2020.3.16
    在线时间
    3 小时

    最佳新人


    发表于 2020.3.19 11:16:34 | 显示全部楼层
    ⭐谢谢~~
    回复

    使用道具 举报

    该用户从未签到

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    36
    积分
    12
    注册时间
    2018.12.1
    在线时间
    4 小时

    发表于 2020.3.19 14:02:39 | 显示全部楼层
    谢谢分享。标记一下,以后认真的学习学习!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017.4.21 21:46
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    草履虫

    Rank: 2

    主题
    0
    奥币
    257
    积分
    9
    注册时间
    2016.11.3
    在线时间
    3 小时

    发表于 2020.3.20 11:05:00 | 显示全部楼层
    谢谢分享。标记一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    6 天前
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    钵水母

    Rank: 3Rank: 3

    主题
    2
    奥币
    458
    积分
    50
    注册时间
    2019.2.3
    在线时间
    29 小时

    发表于 2020.3.23 08:57:06 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情

    前天 13:16
  • 签到天数: 29 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    中华鲟

    Rank: 5Rank: 5

    主题
    0
    奥币
    413
    积分
    653
    注册时间
    2020.1.16
    在线时间
    14 小时

    发表于 2020.3.27 08:43:45 | 显示全部楼层
    学习
    回复

    使用道具 举报

  • TA的每日心情

    6 天前
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    66
    积分
    25
    注册时间
    2018.7.5
    在线时间
    10 小时

    发表于 6 天前 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

  • TA的每日心情

    5 天前
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]初来乍到

    钵水母

    Rank: 3Rank: 3

    主题
    1
    奥币
    14
    积分
    23
    注册时间
    2020.3.30
    在线时间
    1 小时

    发表于 6 天前 | 显示全部楼层
    正在写论文的我,太感谢了,正愁怎么制作热图
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    忙~
    5 天前
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    59
    积分
    15
    注册时间
    2020.3.4
    在线时间
    3 小时

    发表于 5 天前 | 显示全部楼层
    不知道为什么,一看到这种程序就觉得好难。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    前天 13:16
  • 签到天数: 29 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    中华鲟

    Rank: 5Rank: 5

    主题
    0
    奥币
    413
    积分
    653
    注册时间
    2020.1.16
    在线时间
    14 小时

    发表于 5 天前 | 显示全部楼层
    学习
    回复

    使用道具 举报

  • TA的每日心情

    前天 13:16
  • 签到天数: 29 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    中华鲟

    Rank: 5Rank: 5

    主题
    0
    奥币
    413
    积分
    653
    注册时间
    2020.1.16
    在线时间
    14 小时

    发表于 4 天前 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    钵水母

    Rank: 3Rank: 3

    主题
    2
    奥币
    3
    积分
    91
    注册时间
    2019.11.27
    在线时间
    5 小时

    发表于 3 天前 | 显示全部楼层
    学到啦,谢谢
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    忙~
    昨天 20:41
  • 签到天数: 3 天

    连续签到: 3 天

    [LV.2]偶尔看看I

    钵水母

    Rank: 3Rank: 3

    主题
    11
    奥币
    275
    积分
    91
    注册时间
    2017.11.22
    在线时间
    7 小时

    发表于 3 天前 | 显示全部楼层
    有用
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表