R中关于heatmap的那些事

因为有期待,所以就会有各种偶遇。— 记d3heatmap的出世。


那年故事

如果没有记错的话,最初接触heatmap是在2010年,当然,故事还得从R-blogger说起,在此,不得不再次强调下R-bloogger的作用,对于R的新手更是如此。 回归正题,R-blogger上第一篇关于heatmap的介绍在, 第二篇, 第三篇等等。不容否认,heatmap的出现,为矩阵数据框可视化开辟了一个新方向。


heatmap综述

Heatmap主要分为两大类,静态的(static)和交互式(interactive)。R中实现静态heatmap有很多程序包,如fheatmap, gapmap, heatmap3, heatmap.plus, mcheatmaps, NeatMap, pheatmap。 利用强大的ggplot2也可较好地实现heatmap,如这个这个。研究基因的童鞋,对heatmap一定不陌生,见 此文。当然,对于公共卫生领域的朋友,利用heatmap也可较好地实现数据可视化,如大疫情系统中的面板数据(panel data),多个城市或区县的逐日数据,用heatmap来呈现也是相当perfect的。

鉴于网上关于静态heatmap的文章已经很多(随便百度一下,总能出来那么几篇)。在此,我主要介绍交互式hetmap,主要是利用d3heatmaprCharts程序包。


d3heatmap

d3heatmap的介绍可见,毕竟是Rstudio出品,质量没得说,其除了实现最基本的heatmap功能外,还能:

  1. 点击横坐标或者坐标,进而实现类别高亮(highlight)。
  2. 对特定长或者宽的矩形实现放大(zoom in)。
  3. 可以在Rstudio中结合Markdownshiny使用(reproduced)。

废话少说,直接上示例,这个例子你同样可以在这篇博文中找到:

library(d3heatmap)
nba_players<-read.csv("ppg2008.csv",header=T,stringsAsFactors = F)
row.names(nba_players)<-nba_players$Name;nba_players$Name<-NULL
d3heatmap(nba_players, scale = "column",color = "Blues")

短短4行代码,轻松实现交互式heatmap,同时还赠送聚类分析结果,真的很实惠。 此处图形没有出现,正在找原因,你可以在这个网页看到,请点击: Here


rCharts

在没有d3heatmap前,rCharts是创造交互式heatmap唯一的方式。首先得感谢Stefan Wilhelm, 在他的博文中介绍了用R实现交互式heatmap的方法并且附上了详细的代码。其功能和d3heatmap相比,要弱(至于弱在什么地方,读者可自行体验),但终究是一种不错的方式。当数据超过1000行时,需重新定义turboThreshold参数,具体可见其博文。示例如下:

library(dplyr);library(rCharts);library(rjson)
#load("country.RData")
dat.f<-dat.f[1:910,];colnames(dat.f) <- c("y","x","value"); 
    map <- Highcharts$new()
    map$chart(zoomType = "x", type = 'heatmap')
    map$title(text='Sales per employee per weekday')
    map$series(name = 'Sales per employee',data = toJSONArray2(dat.f, json=FALSE))
    map$yAxis(categories = as.character(c(16071:16080)))
    map$xAxis(categories = as.character(c(1:91)))
    map$plotOptions(series=list(turboThreshold = 4000))
    map$addParams(colorAxis = list(min = 0,minColor='#FFFFFF',maxColor='#7cb5ec'))
    map$legend(align='right',layout='vertical',margin=0,verticalAlign='top',y=35,symbolHeight=320)
    map$tooltip(formatter = "#! function() { return '<b>' + this.series.xAxis.categories[this.point.x] + '</b> sold <br><b>' + this.point.value + '</b> items on <br><b>' + this.series.yAxis.categories[this.point.y] + '</b>'; } !#")
    map$addParams(height = 900, width=800, dom="heatmap")

此处我并没有将country这个数据集公开,但只要读者好好研究StefanWilhelm的那篇博文,实现交互式heatmap并不难,但考虑到d3heatmap程序包的强大,rCharts程序包仅仅只是作为一个辅助方式,所以,你懂的。

Previous     Next Spatial-R /
Published under (CC) BY-NC-SA in categories 数据可视化  tagged with R  heatmap  interactive