R: ggplot:如何将一个正方形矩阵(非对称)绘制成热力图?

6

初始的方阵如下所示:

       [,1]        [,2]        [,3]        [,4]        [,5]        [,6]
[1,] 0.00000000 -0.03071266 -0.05202358 -0.06372259 -0.07458787 -0.09827112
[2,] 0.03071266  0.00000000 -0.02131092 -0.03300993 -0.04387521 -0.06755846
[3,] 0.05202358  0.02131092  0.00000000 -0.01169902 -0.02256430 -0.04624754
[4,] 0.06372259  0.03300993  0.01169902  0.00000000 -0.01086528 -0.03454853
[5,] 0.07458787  0.04387521  0.02256430  0.01086528  0.00000000 -0.02368325
[6,] 0.09827112  0.06755846  0.04624754  0.03454853  0.02368325  0.00000000
[7,] 0.13357242  0.10285976  0.08154884  0.06984982  0.05898454  0.03530130
[8,] 0.16375877  0.13304611  0.11173519  0.10003618  0.08917089  0.06548765
        [,7]        [,8]
[1,] -0.13357242 -0.16375877
[2,] -0.10285976 -0.13304611
[3,] -0.08154884 -0.11173519
[4,] -0.06984982 -0.10003618
[5,] -0.05898454 -0.08917089
[6,] -0.03530130 -0.06548765
[7,]  0.00000000 -0.03018635
[8,]  0.03018635  0.00000000

我可以创建像这样的热力图:

heatmap(impl_spread,symm=TRUE)

但我希望在此基础上输入数值。

如果我将其转换为数据框(使用ggplot),则预期如下:

str(data)
'data.frame':   8 obs. of  8 variables:
 $ X1: num  0 0.0307 0.052 0.0637 0.0746 ...
 $ X2: num  -0.0307 0 0.0213 0.033 0.0439 ...
 $ X3: num  -0.052 -0.0213 0 0.0117 0.0226 ...
 $ X4: num  -0.0637 -0.033 -0.0117 0 0.0109 ...
 $ X5: num  -0.0746 -0.0439 -0.0226 -0.0109 0 ...
 $ X6: num  -0.0983 -0.0676 -0.0462 -0.0345 -0.0237 ...
 $ X7: num  -0.1336 -0.1029 -0.0815 -0.0698 -0.059 ...
 $ X8: num  -0.1638 -0.133 -0.1117 -0.1 -0.0892 ...

并且,接着,

然后,

a<-c("1M","3M","6M","9M","1Y","2Y","5Y","10Y")
impl_spread[,ncol(impl_spread)+1]<-a
attach(impl_spread)
impl_spread.m<-melt(impl_spread)
impl_spread.m <- ddply(impl_spread.m, .(variable), transform, rescale = rescale(value))
ggplot(impl_spread.m,aes(V9," ")) + geom_tile(aes(fill = rescale),
colour =   "white") + scale_fill_gradient(low = "white", high = "steelblue")

这个似乎没有产生正确的图形,请帮忙。

提前致谢。


2
我不明白为什么你要将impl_spread传递给ggplot而不是impl_spread.m,以及为什么你要将空字符串作为y美学传递,而不是variable - joran
啊,好的,那就忽略(1),我看错了。修改(2)应该可以解决问题。 - joran
我已经将 y 的美学设为 " "。但这并没有帮助到我。 - Neerav
1
它在垂直方向上显示相同的颜色。如果我错了,请纠正我 - 当您有一个向量并且想将其显示为对称热图时,保持y-aesthetic为空字符串即可。但是这里我有实际数据在一个非对称矩阵中。 - Neerav
看一下head(impl_spread.m)。melt的整个目的是让V9成为您的x变量,而variable则是您的y变量。 - joran
显示剩余2条评论
1个回答

17

试试这个

library(reshape2)
library(ggplot2)
m = matrix(rnorm(20),5)
ggplot(melt(m), aes(Var1,Var2, fill=value)) + geom_raster()

标签 <- c("1M","3M","6M","9M","1Y","2Y","5Y","10Y") for (i in 1:length(标签)) { impl_spread.m$Var1[impl_spread.m$Var1 == i] = 标签[i] impl_spread.m$Var2[impl_spread.m$Var2 == i] = 标签[i] }要确保标签按照相同的顺序打印,需要对数据进行排序。可以使用order()函数根据标签中的值排序,然后在打印时使用排好序的索引来访问标签。 - Neerav
我手动更改了级别,问题得到解决。 再次感谢。 - Neerav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接