如何使用Gadfly绘制n×n矩阵的热力图?
使用Gadfly绘制n×n矩阵热力图的正确方法
你之前的代码问题在于x和y坐标设置错误——直接用1:9会让每个矩形位置混乱重叠,无法形成矩阵网格。下面是两种可行的解决方案:
方法一:使用Geom.rectbin(推荐)
通过将矩阵转换为行列坐标+值的格式,配合离散刻度对齐,就能得到规整的网格热力图:
using Gadfly # 生成n×n矩阵(以3×3为例) n = 3 a = rand(n, n) # 生成每个元素对应的行、列坐标和值 rows = repeat(1:n, inner=n) # 行号:重复1-3各3次 cols = repeat(1:n, outer=n) # 列号:连续1-3重复3轮 values = vec(a) # 矩阵展平为一维数组 # 绘制热力图 plot( x=cols, y=rows, color=values, Geom.rectbin, # 设置离散刻度,对齐矩阵行列 Scale.x_discrete(levels=1:n), Scale.y_discrete(levels=1:n), # 配置主题,添加网格和边框 Theme( panel_stroke=colorant"black", # 面板边框 grid_color=colorant"black", # 网格线颜色 grid_line_width=0.5pt # 网格线粗细 ), Guide.xlabel("列"), Guide.ylabel("行"), Guide.colorkey("数值") )
方法二:使用Geom.rect
手动指定每个矩形的边界(xmin/xmax、ymin/ymax),也能实现相同效果:
using Gadfly n = 3 a = rand(n, n) rows = repeat(1:n, inner=n) cols = repeat(1:n, outer=n) values = vec(a) plot( # 每个矩形的边界:行列号±0.5 xmin=cols .- 0.5, xmax=cols .+ 0.5, ymin=rows .- 0.5, ymax=rows .+ 0.5, color=values, Geom.rect, # 设置坐标范围,让矩阵居中显示 Scale.x_continuous(limits=(0, n+1)), Scale.y_continuous(limits=(0, n+1)), Theme(panel_stroke=colorant"black"), Guide.xlabel("列"), Guide.ylabel("行"), Guide.colorkey("数值") )
关键说明
- 核心是让每个矩阵元素对应唯一的(row, col)坐标,而不是用连续的
1:9这类无意义的位置值。 - 两种方法都能生成规整的网格热力图,
rectbin更适合离散坐标场景,代码更简洁;rect则能更灵活控制矩形的大小和位置。
内容的提问来源于stack exchange,提问作者imantha
相关产品推荐
相关产品推荐

