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

Django结合D3实现热力图时相同名称仅展示一次问题排查

问题根因
  • D3 中 scaleBand 要求传入的 domain 是唯一离散值数组,你当前直接遍历所有数据生成 myGroups、myVars,数组内存在大量重复值,会导致坐标映射逻辑异常,出现方格重叠、错位问题。
  • 你绑定数据时用 d.group + ':' + d.variable 作为唯一标识 key,如果两个数据项的 group 和 variable 完全一致,key 就会重复。D3 的数据绑定逻辑中,enter() 阶段只会为第一个出现的唯一 key 创建 <rect> 元素,后续相同 key 的数据会被直接忽略,这就是“名称一致但数值不同的项仅展示一次”的直接原因。
解决方案

分两种业务场景处理:

场景1:标准热力图逻辑(同一 group+variable 交叉点仅展示一个数值)

标准方格热力图本身要求每个 X(分组)、Y(变量)的交叉点对应唯一数值,你需要先对原始数据做聚合去重:

  1. 先处理数据,对重复的 group+variable 组合的数值做聚合(可按需换为取最大值、最小值、最新值等逻辑,以下示例取平均值)
  2. 给 X、Y 轴的 domain 做去重处理
    对应修改代码如下:
// 第一步:聚合重复的group+variable数据,示例取平均值
const aggregatedData = Object.values(data.reduce((acc, cur) => {
  const key = cur.group + ':' + cur.variable;
  if (!acc[key]) {
    acc[key] = {...cur, count: 1};
  } else {
    acc[key].value = (acc[key].value * acc[key].count + cur.value) / (acc[key].count + 1);
    acc[key].count +=1;
  }
  return acc;
}, {}));

// 第二步:生成去重后的分组、变量数组
var myGroups = Array.from(new Set(aggregatedData.map(d => d.group)));
var myVars = Array.from(new Set(aggregatedData.map(d => d.variable)));

// 后续X、Y轴比例尺逻辑不变,绑定数据时用聚合后的aggregatedData代替原data
svg.selectAll("rect") 
  .data(aggregatedData, function(d) {
    return d.group + ':' + d.variable;
  })
  .enter()
  .append("rect")
  // 其余属性、样式逻辑保持你原有写法即可

场景2:需要将所有重复数据项都展示为独立方格

如果你确实需要把所有数据项都独立展示,说明当前的group、variable两个维度不足以区分每个数据项,你需要调整key规则和轴逻辑:

  1. 绑定数据时给key加上唯一标识(比如数组索引),避免key重复
  2. 调整X/Y轴的维度逻辑,为每个数据项分配独立的坐标位置,不会出现重叠
    对应修改绑定数据部分代码示例:
svg.selectAll("rect")
  .data(data, function(d, index) {
    // 加上索引保证每个key唯一
    return d.group + ':' + d.variable + ':' + index;
  })
  .enter()
  .append("rect")
  // 此处x、y的计算逻辑需要你根据业务调整,保证每个方格位置不重叠

内容的提问来源于stack exchange,提问作者Ab6578

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:15:01