You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:35:06