使用CairoMakie绘制三角晶格热力图显示异常的解决咨询
三角晶格热力图绘制异常的解决方法
你当前的代码用heatmap绘制三角晶格点集出现异常,核心原因是heatmap要求输入二维规则网格的x、y坐标矩阵和对应的二维数据数组,而你把晶格点转成了一维列表,完全不符合heatmap的输入逻辑。以下是针对性的解决方法:
方法1:用散点图直接展示晶格点
如果只是要呈现三角晶格的分布,scatter是更适合的工具,它专门用于绘制离散点集:
using CairoMakie samplebjs = [[cos(π/3), sin(π/3)], [cos(2π/3), sin(2π/3)]] testN = 100 # 生成二维晶格网格 sampleLattice = [[i, j] for i in 1:testN, j in 1:testN] # 计算三角晶格坐标 xs = [sum(v .* samplebjs)[1] / testN for v in sampleLattice] ys = [sum(v .* samplebjs)[2] / testN for v in sampleLattice] # 绘制散点,调整markersize控制点大小 fig, ax, sc = scatter(xs, ys; color=fill(1, length(xs)), markersize=2, strokewidth=0) display(fig)
方法2:用六边形分箱实现类热力图效果
如果需要类似热力图的密度展示,使用hexbin函数——它会自动对三角晶格区域进行六边形分箱统计,生成连续的热力效果:
using CairoMakie samplebjs = [[cos(π/3), sin(π/3)], [cos(2π/3), sin(2π/3)]] testN = 100 sampleLattice = [[i, j] for i in 1:testN, j in 1:testN] xs = [sum(v .* samplebjs)[1] / testN for v in sampleLattice] ys = [sum(v .* samplebjs)[2] / testN for v in sampleLattice] # 调整binsize控制分箱粒度 fig, ax, hb = hexbin(xs, ys; binsize=0.01, colormap=:viridis) display(fig)
方法3:优化三角晶格生成逻辑
你当前的晶格生成方式会产生冗余点,可通过奇偶行偏移优化,让晶格更贴合三角结构的真实排列:
using CairoMakie testN = 100 # 三角晶格标准基矢 a1 = [1.0, 0.0] a2 = [0.5, √3/2] xs = Float64[] ys = Float64[] for i in 1:testN for j in 1:testN x = (i-1)*a1[1] + (j-1)*a2[1] y = (i-1)*a1[2] + (j-1)*a2[2] # 偶数行添加水平偏移,实现紧凑三角排列 if j % 2 == 0 x += a1[1]/2 end push!(xs, x/testN) push!(ys, y/testN) end end fig, ax, sc = scatter(xs, ys; markersize=2, color=fill(1, length(xs))) display(fig)
内容的提问来源于stack exchange,提问作者Mstislav Keldysh
相关产品推荐
相关产品推荐

