将树形图添加到ggplot2热图

时间:2016-08-02 17:52:23

标签: r colors heatmap dendrogram

这里有新R用户。 我正在尝试为我使用ggplot2创建的热图添加树形图。我怎样才能做到这一点?我已将我的代码添加到下面的热图中。

#Mtcars using ggplots and reshape2 
install.packages("ggplot2")
library(ggplot2)
intall.packages("reshape2")
library(reshape2)
data(mtcars)
Cars <- mtcars[c(1:7)] #subset to 6 genres

cor(Cars) # 6x6 cor matrix

#ggplot likes the data 'melted' one value per row
m <-melt(cor(Cars)) 
p <- ggplot(data=m, aes(x=Var1, y=Var2, fill=value)) + geom_tile()
p

#set up a coloring scheme using colorRampPalette
red=rgb(1,0,0); green=rgb(0,1,0); blue=rgb(0,0,1); black=rgb(0,0,0)
RtoBrange<-colorRampPalette(c(red, black ) )
BtoGrange<-colorRampPalette(c(black, green) ) 

p <- p + scale_fill_gradient2(low=RtoBrange(100), mid="black",           high=BtoGrange(100))
p

感谢您的帮助,

夏洛特

3 个答案:

答案 0 :(得分:2)

这有点棘手,因为并非所有部分都已完全准备就绪,但我在heatmaply开始的工作的目的是达到这一点。如果您对此感兴趣,以便使用树形图来创建具有树形图的交互式热图,那么您应该查看heatmaply vignette

如果您对静态热图感兴趣,我相信现有的软件包已经做得很好,所以重新发明这个轮子可能不值得。 但如果这仍然是你想要做的,这里是它的主要步骤:

  1. 生成树状图对象
  2. 在ggplot2
  3. 中绘制树状图对象
  4. 以符合行顺序(或树形图中的列)的方式创建热图
  5. 合并对象。
  6. 第1步可以使用hclustas.dendrogram,第2步需要来自dendextend的[as.ggdend][2]函数。第3步可以使用heatmaply :: heatmapr + heatmaply ::: ggplot_heatmap(目前已隐藏,但将来会公开此类事情)。第4步很棘手,到目前为止,我还不能让它“运行得很好”,因为元素的比例并不好。

    我把它包装成一个新的ggheatmap函数,然后将其上传到heatmaply on github。但这需要更多的工作,所以我愿意接受请求。与此同时,以下是如何做到这一点:

    devtools::install_github("ropensci/plotly") # you will probably benefit from the latest version of plotly
    devtools::install_github('talgalili/heatmaply')
    
    library(heatmaply)
    x <- heatmapr(iris[,-5], scale = "column", colors = "Blues")
    ggheatmap(x)
    

    输出如下:

    enter image description here

    由于我正在使用GGally::ggmatrix,我似乎无法控制每个对象的比例。在其他方面可能还有更多工作要做(比如处理标签的布局,在侧面添加颜色图例等)。

答案 1 :(得分:1)

使用heatmap.2包(https://cran.r-project.org/web/packages/gplots/gplots.pdf)中的gplots功能,该功能会自动为热图添加树形图。使用您的示例:

install.packages("gplots")
library(gplots)

data(mtcars)
Cars <- mtcars[c(1:7)]

mycolors <- colorRampPalette(c("red", "black", "green"))
heatmap.2(cor(Cars), trace = "none", col = mycolors)

答案 2 :(得分:1)

或尝试let path = ... // the UIBezierPath let animation = CAKeyFrameAnimation() animation.path = path.CGPath animation.calculationMode = kCAAnimationPaced // This give the animation an even pace animation.repeatCount = HUGE // This makes the animation repeat forever viewToAnimation.layer.addAnimation(animation, forKey: nil) 功能:

heatmap3

enter image description here