【问题标题】:Create quadratic matrix with lower triangle as heatmaps and upper triangle character data创建具有下三角形作为热图和上三角形字符数据的二次矩阵
【发布时间】:2015-07-25 10:09:07
【问题描述】:

我有以下(示例)数据,我想绘制: matrix(c("Variable1",0.4,0.5,"string1","Variable2",0.3, "string2","string3","Variable3"),ncol=3)

我想用矩阵的数字0.4,0.5,0.3 创建热图并使用下三角:

  numeric<- matrix(c(1,0.4,0.5,0.4,1,0.3,0.5,0.3,1),ncol=3)
  require(graphics)
  require(grDevices)
  library(colorRamps)

  library(lattice)
  x <- seq(pi/4, 5*pi, length.out=10)
  y <- seq(pi/4, 5*pi, length.out=10)
  grid <- expand.grid(X=x, Y=y)

   myPanel <- function(x, y, z, ...) { 
   panel.levelplot(x,y,z,...)
   panel.text(x, y, round(z,2),cex=0.578,...)}
  levelplot(numeric,panel=myPanel)

在包括热图对角线的上三角形上,我想要字符,其值 "string1", "string2", "string3", "Variable1", "Variable2", "Variable3" 与给定矩阵中的网格位置相同!

我想以某种方式创建一个网格并使用图形包的image() 函数为数字着色,但这对我不起作用。

你有一个简单而优雅的函数,你只需要给定的矩阵作为输入吗?

【问题讨论】:

    标签: r panel heatmap


    【解决方案1】:

    您可以尝试ComplexHeatmap 包,通过它您可以自定义热图主体:

    首先创建一个对称矩阵:

    set.seed(123)
    mat = matrix(rnorm(100), 10)
    colnames(mat) = letters[1:10]
    
    mat2 = cor(mat)
    

    对行和列进行聚类和调整顺序:

    od = hclust(dist(mat2))$order
    mat2 = mat2[od, od]
    

    现在我们可以自定义热图。在以下代码中,col 控制如何将值映射到颜色。 由于已经应用了聚类,我们将cluster_rowscluster_columns 设置为FALSE。 当typegpar()中设置为none时,热图被初始化但没有添加任何内容, 然后我们可以使用自定义函数cell_fun来添加图形。

    cell_fun 将应用于热图中的每个小网格。 在cell_fun 中,有七个参数:

    • jmat2 中的列索引
    • imat2 中的行索引
    • x:图上的位置
    • y:图上的位置
    • w: 当前网格的宽度
    • h: 当前网格的高度
    • col:当前网格的填充颜色

    使用Heatmap() 生成最终的热图:

    Heatmap(mat2, col = colorRamp2(c(-1, 0, 1), c("green", "white", "red")),
        cluster_rows = FALSE, cluster_columns = FALSE,
        heatmap_legend_title = "cor", rect_gp = gpar(type = "none"), 
        cell_fun = function(j, i, x, y, w, h, col) {
            if(i > j) {
                grid.rect(x, y, w, h, gp = gpar(fill = col))
            } else if(j == i) {
                grid.text(labels[i], x, y)
            } else {
                grid.text(sprintf("%.2f", mat2[i, j]), x, y)
            }
            grid.rect(x, y, w, h, gp = gpar(fill = NA, col = "black"))
        })
    

    【讨论】:

    • 为什么要对相关矩阵进行聚类?
    • 您的热图功能是否也可以仅更改上三角形的图形参数 par(pin=..., ps=...=) ?例如:我想创建一个配对面板,它在下三角形上有热图(具有相关值),在上三角形上,一些特殊功能会用对(...,panel=)创建等高线图。这种特殊的等高线图功能会自动用高度值标记等高线。我可以通过使用 par(pin=0,ps=c(0,0)) 来避免这种标记,但是下面板上相关值的大小也会消失。 PS:我喜欢 Github 上的热图。
    • 聚类只是用来把相关的项目放在一起。
    • 您可以通过自定义cell_fun将任何类型的图形添加到小网格中。但是如果要添加等高线图这样复杂的图形并不容易,因为需要通过低级网格函数重新实现等高线图。但是关于你的问题,如果你只想改变上三角的参数,你可以修改最后一个else代码块中的代码。上面的三角形只会执行这些代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2011-06-16
    • 2011-01-20
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多