查看: 1372|回复: 11

[R语言] 如何绘制“漂亮”的热图?

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

    连续签到: 1 天

    [LV.1]初来乍到

    管理员

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

    主题
    83
    奥币
    682
    积分
    770
    注册时间
    2019.7.8
    在线时间
    146 小时

    发表于 2020.1.8 10:00:25 | 显示全部楼层 |阅读模式
    说到绘制热图,其实有非常多的绘制方法,比如使用R包、Origin、Graphpad Prism、OmicShare tools等等,也有大佬尝试用Excel绘制,感兴趣可到 拓展阅读 部分查看。

    虽然有这么多的方法,但出图最好看的方法是使用pheatmap(Pretty Heatmaps)这个R包绘制热图。在众多绘制热图的R包中,pheatmap也相对容易上手。 虽然这个R包我自己用了很多次,但仍有一些地方抱有疑问,比如能不能换字体?图例的刻度、大小能不能调? 下面就以
    《推荐一个快速绘制热图的在线工具》一文的数据为例,介绍一些pheatmap的一些个性化调整方法。


    #加载R包;
    library(pheatmap)
    #查看当前目录的文件;
    dir()
    #读入数据;
    df<-read.table("top30genesexp.txt",header= T,row.names = 1,sep = "\t")
    #查看数据的前6行,前6列;
    df[1:6,1:6]


    绘制热图


    #自定义颜色;
    mycol<-colorRampPalette(c("white","tomato"))(100)
    p<-pheatmap(df,scale = "row",
               border_color ="white",color = mycol,
               show_rownames=F)
    p




    #调整图例颜色条的刻度和刻度标签;
    p1<-pheatmap(df,scale = "row",
               border_color ="white",color = mycol,
               show_rownames=F,
                legend_breaks=c(-2.5,-1.25,0,1.25,2.5),
               legend_labels=c("-2.5","-1.25","0","1.25","2.5"))
    p1


    #进化聚类树的高度设置(默认50 points);
    p2<-pheatmap(df,scale = "row",
               border_color ="white",color = mycol,
               show_rownames=F,
                legend_breaks=c(-2.5,-1.25,0,1.25,2.5),
               legend_labels=c("-2.5","-1.25","0","1.25","2.5"),
               treeheight_row=40,
               treeheight_col=40)
    p2


    #调整“横轴”字体方向(可输入值:“270”, “0”, “45”, “90”, “315”;默认270,0水平,90°逆时针旋转90°);
    #利用fontsize和fontsize_col调出两种不同大小的字体;
    p3<-pheatmap(df,scale = "row",
                border_color ="white",color = mycol,
                show_rownames=F,
                legend_breaks=c(-2.5,-1.25,0,1.25,2.5),
                legend_labels=c("-2.5","-1.25","0","1.25","2.5"),
                 treeheight_row=40,
                treeheight_col=40,
                fontsize=6,
                fontsize_col=8,
                angle_col = 90)
    p3



    添加标记

    #生成注释所用数据框;
    ano_col<-data.frame(Cluster =factor(paste0('Cluster',cutree(p2$tree_col,3))))
    order<-p3$tree_col$order
    collab<-p3$tree_col$labels
    row.names(ano_col)=collab[order]
    p4<-pheatmap(df,scale = "row",
                border_color ="white",color = mycol,
                show_rownames=F,
                legend_breaks=c(-2.5,-1.25,0,1.25,2.5),
                 legend_labels=c("-2.5","-1.25","0","1.25","2.5"),
                treeheight_row=40,
                treeheight_col=40,
                fontsize=6,
                fontsize_col=8,
                angle_col = 90,
                annotation_col=ano_col,
                 )
    p4


    #类似的也可以生成行标记;
    ano_row<-data.frame(gene =factor(paste0('Cluster',cutree(p2$tree_row,9))))
    order1<-p3$tree_row$order
    rowlab<-p3$tree_row$labels
    row.names(ano_row)=rowlab[order1]
    p5<-pheatmap(df,scale = "row",
                border_color ="white",color = mycol,
                show_rownames=F,
                legend_breaks=c(-2.5,-1.25,0,1.25,2.5),
                legend_labels=c("-2.5","-1.25","0","1.25","2.5"),
                treeheight_row=40,
                treeheight_col=40,
                fontsize=6,
                fontsize_col=8,
                angle_col = 90,
                annotation_col=ano_col,
                annotation_row=ano_row)
    p5


    #如果不喜欢标记的图例,可使用annotation_legend=F隐藏掉;
    p6<-pheatmap(df,scale = "row",
                border_color ="white",color = mycol,
                show_rownames=F,
                legend_breaks=c(-2.5,-1.25,0,1.25,2.5),
                legend_labels=c("-2.5","-1.25","0","1.25","2.5"),
                treeheight_row=40,
                treeheight_col=40,
                fontsize=6,
                fontsize_col=8,
                 angle_col= 90,
                annotation_col=ano_col,
                annotation_row=ano_row,
                annotation_legend=F,
                filename = "top30heatmap.pdf",width = 5,height = 3.8
                 )
    p6


    导出数据


    # 按照热图的顺序,导出作图数据;
    result = data.frame(df[order1,order])
    # 整理表格,避免第一行数据错位;
    result = data.frame(rownames(result),result)
    colnames(result)[1] = "gene_id"
    #导出数据到工作目录中;
    write.table(result,file="Top30headmap.txt",
               row.names=F,quote = F,sep='\t')

    最后,关于调字体,我尝试过使用family参数指定字体,嗯,并没有成功。而图例的大小貌似是固定的,只能将画布和字体调大来相对的让图例的比例小一些,或者导出矢量图用Ai调整。另外,图表的边距似乎也无法自定义…… 对于这些问题,如果你有更好的方法可以留言,今天的内容就到这里啦~

    拓展阅读

    《如何用GraphPadPrism绘制热图》

    本文作者:基迪奥-莫北

    本帖子中包含更多资源

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

    x
    回复

    使用道具 举报

  • TA的每日心情

    昨天 12:19
  • 签到天数: 36 天

    连续签到: 12 天

    [LV.5]常住居民I

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    363
    积分
    11
    注册时间
    2016.11.7
    在线时间
    7 小时

    发表于 2020.1.8 22:28:12 | 显示全部楼层
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情

    2020.1.30 22:36
  • 签到天数: 312 天

    连续签到: 1 天

    [LV.8]以坛为家I

    帝王蝶

    Rank: 4

    主题
    0
    奥币
    751
    积分
    249
    注册时间
    2018.1.22
    在线时间
    114 小时

    发表于 2020.1.9 08:36:32 | 显示全部楼层
    学习学习
    回复

    使用道具 举报

  • TA的每日心情

    2020.2.1 09:32
  • 签到天数: 14 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    108
    积分
    47
    注册时间
    2019.4.24
    在线时间
    3 小时

    发表于 2020.1.9 10:31:18 | 显示全部楼层
    学习
    回复

    使用道具 举报

  • TA的每日心情
    yes!
    昨天 09:54
  • 签到天数: 386 天

    连续签到: 2 天

    [LV.9]以坛为家II

    帝王蝶

    Rank: 4

    主题
    1
    奥币
    1669
    积分
    381
    注册时间
    2016.9.4
    在线时间
    99 小时

    发表于 2020.1.9 14:10:10 | 显示全部楼层
    优秀,有关pheatmap包的详细使用教程越来越多了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019.11.28 10:37
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    48
    积分
    147
    注册时间
    2016.9.13
    在线时间
    31 小时

    发表于 2020.1.14 17:34:33 | 显示全部楼层
    cluster3.0
    回复

    使用道具 举报

  • TA的每日心情
    yes!
    6 天前
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    73
    积分
    66
    注册时间
    2019.6.20
    在线时间
    8 小时

    发表于 2020.1.15 16:16:23 | 显示全部楼层
    感谢楼主的无私奉献
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    好棒
    昨天 09:17
  • 签到天数: 11 天

    连续签到: 4 天

    [LV.3]偶尔看看II

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    109
    积分
    101
    注册时间
    2018.10.19
    在线时间
    15 小时

    发表于 2020.1.16 16:00:05 | 显示全部楼层
    感谢楼主的无私奉献
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    yes!
    2020.1.10 11:08
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    帝王蝶

    Rank: 4

    主题
    0
    奥币
    236
    积分
    314
    注册时间
    2019.11.21
    在线时间
    10 小时

    发表于 2020.1.17 00:04:42 | 显示全部楼层
    收藏
    回复

    使用道具 举报

  • TA的每日心情
    好棒
    5 小时前
  • 签到天数: 13 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    126
    积分
    97
    注册时间
    2019.3.14
    在线时间
    7 小时

    发表于 2020.1.17 10:47:35 | 显示全部楼层
    repost,学习!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    好棒
    昨天 09:17
  • 签到天数: 11 天

    连续签到: 4 天

    [LV.3]偶尔看看II

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    109
    积分
    101
    注册时间
    2018.10.19
    在线时间
    15 小时

    发表于 2020.1.18 19:54:27 | 显示全部楼层
    收藏了!
    回复

    使用道具 举报

  • TA的每日心情
    好棒
    5 小时前
  • 签到天数: 13 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    钵水母

    Rank: 3Rank: 3

    主题
    0
    奥币
    126
    积分
    97
    注册时间
    2019.3.14
    在线时间
    7 小时

    发表于 2020.2.7 09:46:51 | 显示全部楼层
    复制粘贴再学习
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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