ggplot2中的热图问题具有填充

时间:2018-07-27 13:15:41

标签: r loops ggplot2 heatmap fill

我正在尝试使用ggplot2制作热图。我要绘制的是矩阵的形式,这是函数的结果。

以下是数据:

Image   A   B   C   D   E   F   
 1      3   23  45  23  45  90
 2      4   34  34  34  34  89
 3      34  33  24  89  23  67
 4      3   45  234 90  12  78
 5      78  89  34  23  12  56
 6      56  90  56  67  34  45

以下是函数:

vector_a <- names(master)[2:4] 
vector_b <- names(master)[5:6]

heatmap_prep <- function(dataframe, vector_a,vector_b){
    dummy <- as.data.frame(matrix(0, nrow=length(vector_a), ncol=length(vector_b)))
    for (i in 1:length(vector_a)){
                first_value <- dataframe[[ vector_a[i]  ]]
                # print(first_value)
            for(j in 1:length(vector_b)){
                    second_value <- dataframe[[ vector_b[j] ]]
 result <- cor(first_value, second_value, method = "spearman")
                    dummy [i,j] <- result
            }
        }

rownames(dummy) <- vector_a
return(as.matrix(dummy))
heatmap_data_matrix1 <- heatmap_prep(master,vector_a, vector_b)

使用heatmap_data_matrix1中的数据,我想使用以下代码创建一个热图:

library(ggplot2)
if (length(grep("ggplot2", (.packages() ))) == 0){
        library(ggplot2) 
    }

p <- ggplot(data = heatmap_data_matrix1, aes(x = vector_a, y = vector_b)
+ geom_tile(aes(fill = ))

但是,这不起作用。如何重新格式化我的数据/代码,以便可以创建此热图?我应该在“ fill =“下输入什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

由于许多R函数已向量化,并且在大多数情况下,您无需预先分配或定义向量,因此for循环是不必要的。您只需运行corr(x,y, method = "spearman"),就不会造成循环的麻烦。

关于要填充的内容的问题,您需要将数据重塑为ggplot2使用的配置(长格式)。

gather中的tidyr函数将关联的行/列放在单独的列中,然后使用r值进行填充。

library(tidyverse) # for tidyr, tibble, ggplot2, and magrittr

heatmap_function <- function(df, a, b) {

  cor_data <- cor(df[a], df[b], method = "spearman") %>% 
    as.data.frame(rownames = a) %>% 
    rownames_to_column("x") %>% 
    gather(y, fill, -x)

  ggplot(cor_data, aes(x = x, y = y, fill = fill)) +
    geom_tile()

}

结果是:

heatmap_function(master, c("A","B","C"), c("D","E"))

enter image description here