我正在尝试使用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 =“下输入什么?
谢谢!
答案 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"))