Plots.jl中heatmap绘制矩阵无法保留原始方向的解决方法
Plots.jl heatmap绘制矩阵朝向异常解决方案
问题复现
使用Plots.jl的heatmap函数绘制灰度像素网格时,函数默认不会保留输入矩阵的原始视觉朝向,会对矩阵做垂直反射变换,复现代码如下:
using Random, Plots mymatrix = zeros(Int, (5,5)) mymatrix[1,1] = 1 # 此时mymatrix的第一行第一列值为1,其余位置为0 # REPL打印时1出现在矩阵左上角位置 mymatrix #= 5x5 Matrix{Int64}: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =# heatmap(mymatrix, color = :greys)
运行上述代码得到的可视化结果中,值为1的像素点出现在左下角位置,和矩阵打印的视觉顺序不一致:
经多组测试确认,该现象是heatmap默认的y轴渲染规则导致,查阅官方文档未找到明确的行为说明,需要无需修改原始输入矩阵的修正方案。
解决方法
- 单次绘图传参(推荐):
heatmap原生支持yflip参数,传入yflip=true即可在渲染时翻转y轴方向,完全抵消默认的垂直反射效果,不需要对原始矩阵做任何修改:
使用该参数后,矩阵的索引和渲染位置完全对应:矩阵heatmap(mymatrix, color = :greys, yflip = true)[i,j]位置的元素会显示在图中第i行、第j列的位置,和REPL打印矩阵的视觉顺序完全一致,[1,1]位置的元素会出现在图的左上角。 - 设置全局默认参数:如果需要批量绘制矩阵,不想每次调用
heatmap都传参,可以在绘图代码开头设置全局默认值:using Plots default(yflip = true) # 后续所有heatmap调用都会默认开启y轴翻转 heatmap(mymatrix, color = :greys)
原因说明
该现象不是函数bug,是坐标系默认规则的差异:
- Plots的
heatmap默认遵循标准笛卡尔坐标系规则,y轴数值从下到上递增 - 文本打印矩阵时,行号从上到下递增,两者y轴方向刚好相反,因此会出现视觉上的垂直反射效果
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

