在 Julia 中的常规二维网格上绘制值

Plotting values on a regular 2D grid in Julia

在规则的二维点阵上设置了特定的参数值。我想以规则网格的单元格形式显示它们,并根据参数值填充颜色。个别网格节点可能存在间隙。这是数据示例和绘图的预期结果:

a = [1, 2, 3, 1, 2, 3, 1, 2]
b = [1, 1, 1, 2, 2, 2, 3, 3]
c = [1, 5, 4, 3, 4, 2, 1, 3]

plot(a, b, zcolor = c, aspect_ratio = 1, xlim = (0.5, 3.5), ylim = (0.5, 3.5), clim = (0, 5),
seriestype = :scatter, markersize = 82, markershape = :square, markerstrokewidth = 0.5,
legend = false, colorbar = true)

这种方法可行,但在这种情况下,每次都需要调整正方形的大小,以便单元格之间没有间隙,并且它们不会 运行 彼此重叠。这需要不断的人工干预,而且看起来不是正确的解决方案。在这种情况下最正确的方法是什么?我考虑过 heatmap(),但据我了解,在 Julia 中它不知道如何显示单元格边框。也许有某种方法可以在 plot() 中以绝对 canvas 单位设置图标大小?还是在这种情况下使用其他方法更好?

heatmap 似乎适合我。如果你的 ab 跨越了整个格子,我会用 reshapereshape c。这不是你这里的情况,所以一种解决方案是用 NaNs 填充你没有价值的格子。例如,

using Plots
a = [1, 2, 3, 1, 2, 3, 1, 2]
b = [1, 1, 1, 2, 2, 2, 3, 3]
c = [1, 5, 4, 3, 4, 2, 1, 3]
x, y = sort(unique(a)), sort(unique(b)) # the lattice x and y
C = fill(NaN, length(y), length(x)) # make a 2D C with NaNs
for (i,j,v) in zip(a,b,c) # fill C with c values
    C[j,i] = v
end
heatmap(x, y, C, clims=(0,5)) # success!

给予


EDIT:如果你想指定单元格的边缘,你可以用heatmap来完成,如果你想要线条,你可以手动添加它们我想,例如 vlinehline?

ex, ey = [0, 1.5, 2.3, 4], [0.5, 1.5, 2.5, 3.5]
heatmap(ex, ey, C, clims=(0,5)) 
vline!(ex, c=:black)
hline!(ey, c=:black)

会给