2

在常规 2D 晶格上设置了一定的参数值。我想以常规网格的单元格的形式显示它们,根据参数的值填充颜色。各个网格节点中可能存在间隙。以下是数据示例和所需的绘图结果:

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() 中以绝对画布单位设置图标大小?还是在这种情况下使用其他方法更好?

4

1 回答 1

2

heatmap似乎是我的路。如果你的ab跨越整个格子,我会用它reshape重塑 c. 这不是你的情况,所以一种解决方案是NaN在你没有价值的地方用 s 填充格子。例如,

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!

在此处输入图像描述


编辑:如果你想指定单元格的边缘,你可以这样做heatmap,如果你想要线条,我猜你可以手动添加它们,例如使用vlineand hline?

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)

会给

在此处输入图像描述

于 2021-01-27T23:56:41.820 回答