关于R语言image()函数结合矩阵使用的可视化结果疑问
为什么R中
image(mat)的可视化和原矩阵不对应? 这是R里用image()画矩阵时非常容易踩的小坑!核心原因是这个函数的默认行为和我们常规看矩阵的习惯不一致,具体有两点:
1. 矩阵被默认转置了
image()函数在处理矩阵时,会自动把原矩阵的行和列互换(相当于执行了t(mat)的操作)。比如你定义的矩阵第二行全是0,但在默认的image()图里,你会看到第二列是全浅色(假设0对应低亮度),而不是第二行。
2. 绘制起点是左下角,而非左上角
我们平时看矩阵都是从左上角第一行开始,但image()默认是从左下角开始绘制的,相当于把原矩阵上下翻转了一遍。结合上面的转置操作,最终的图像自然和你预期的矩阵样子对不上。
举个直观的例子:你的原矩阵第一行是[1,1,1],第三行是[1,0,1],但默认image()画出来后,你会发现顶部的行对应原矩阵的第三行,而底部对应原矩阵的第一行,同时列的顺序也被反转了。
怎么修正?
想要让图像和原矩阵的视觉顺序一致,可以这样做:
方法1:调整image()的参数
手动转置矩阵,同时反转y轴的范围,让绘制起点变回左上角:
mat <- matrix(c(1,1,1,0,0,0,1,0,1), nrow=3, byrow=TRUE) image(t(mat), ylim = c(1, 0))
这样画出来的图就会和你定义的矩阵完全对应了。
方法2:用ggplot2绘制(更直观)
如果习惯用ggplot2,它的geom_tile()默认逻辑更贴合我们对矩阵的认知,只需要反转y轴即可:
library(ggplot2) library(reshape2) # 把矩阵转成数据框 mat_df <- melt(mat) # 绘制热力图,反转y轴让行号从顶部开始 ggplot(mat_df, aes(x = Var2, y = Var1, fill = value)) + geom_tile() + scale_y_reverse() + labs(x = "列", y = "行")
内容的提问来源于stack exchange,提问作者Suhail Gupta
相关产品推荐
相关产品推荐

