Skip to content

3D 热力图

3D 热力图通过柱体高度和颜色映射展示二维矩阵数据的密度分布,直观呈现数据在两个维度上的分布特征,适用于时间分布、地理热力、温度分布等场景。

快速开始

最简单的 3D 热力图需要配置 X 轴、Z 轴和数据:

vue
<template>
  <RayHeatmap3D :option="chartOption" />
</template>

<script setup>
import { ref } from 'vue';
import { RayHeatmap3D } from 'raychart';

const chartOption = ref({
  xAxis3D: {
    data: ['周一', '周二', '周三', '周四', '周五'],
    name: '星期',
  },
  zAxis3D: {
    data: ['数学', '语文', '英语'],
    name: '科目',
  },
  yAxis3D: {
    name: '分数',
  },
  series: [
    {
      type: 'heatmap3D',
      data: [
        { x: '周一', z: '数学', value: 85 },
        { x: '周二', z: '数学', value: 92 },
        { x: '周三', z: '数学', value: 78 },
        { x: '周一', z: '语文', value: 75 },
        { x: '周二', z: '语文', value: 82 },
        // ... 更多数据点
      ],
    },
  ],
});
</script>

智能默认值

自动配置颜色映射、柱体高度、标签显示和光照效果。

核心配置

坐标轴配置

属性类型默认值说明
xAxis3D.datastring[]-X 轴类别(必填)
xAxis3D.namestring-X 轴名称
zAxis3D.datastring[]-Z 轴类别(必填)
zAxis3D.namestring-Z 轴名称
yAxis3D.namestring-Y 轴名称(数值轴)

数据配置

属性类型默认值说明
series.dataArray<{x: string, z: string, value: number}>-热力数据(必填)
series.namestring-系列名称

数据格式说明

series.data 是对象数组,每个对象包含三个字段:

  • x: X 轴的类别值(必须与 xAxis3D.data 中的值匹配)
  • z: Z 轴的类别值(必须与 zAxis3D.data 中的值匹配)
  • value: 数值,决定柱体高度和颜色

示例:

javascript
data: [
  { x: '周一', z: '数学', value: 85 },
  { x: '周二', z: '数学', value: 92 },
  { x: '周一', z: '语文', value: 75 },
]

样式配置

属性类型默认值说明
series.tileHeightnumber0.15色块基础高度
series.colorGradientArray<{stop, color}>内置 8 色冷→暖渐变自定义颜色映射(stop 为 0-1 的渐变位置)
series.itemStyle.roughnessnumber0.4色块粗糙度
series.itemStyle.metalnessnumber0.05色块金属度

数据格式

series.data 支持三种格式:

  • 对象数组:[{ x: '周一', z: '数学', value: 85 }]
  • 索引数组:[[0, 0, 85], [1, 0, 92]](x/z 轴类别由轴配置提供)
  • 二维数组:[[85, 92, 78], [75, 82, 88]](行对应 Z 轴、列对应 X 轴)
网格配置(可选)

通过 grid3D 配置三维空间尺寸:

javascript
grid3D: {
  show: true,       // 显示网格边框
  boxWidth: 20,     // 宽度
  boxHeight: 10     // 高度
}

常见场景

基础热力图

展示每周各科成绩分布:

vue
<template>
  <RayHeatmap3D :option="chartOption" />
</template>

<script setup>
import { ref } from 'vue';
import { RayHeatmap3D } from 'raychart';

const xLabels = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
const zLabels = ['数学', '语文', '英语', '物理', '化学'];

// 生成随机成绩数据
const data = [];
zLabels.forEach((subject) => {
  xLabels.forEach((day) => {
    const value = Math.round(60 + Math.random() * 40);
    data.push({ x: day, z: subject, value });
  });
});

const chartOption = ref({
  grid3D: {
    show: true,
    boxWidth: 20,
    boxHeight: 10,
  },
  xAxis3D: {
    data: xLabels,
    name: '星期',
  },
  zAxis3D: {
    data: zLabels,
    name: '科目',
  },
  yAxis3D: {
    name: '分数',
  },
  series: [
    {
      type: 'heatmap3D',
      name: '成绩热力图',
      data,
      tileHeight: 0.15,
      label: {
        show: true,
        fontSize: 10,
        color: '#333',
      },
    },
  ],
});
</script>

时段活跃度分布

展示一周各时段的活跃度:

vue
<script setup>
const days = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
const hours = ['0时', '3时', '6时', '9时', '12时', '15时', '18时', '21时'];

// 模拟活跃度数据
const data = [];
days.forEach((day, zi) => {
  hours.forEach((hour, xi) => {
    // 工作日白天活跃,周末全天活跃
    const isWeekend = zi >= 5;
    const isWorkHour = xi >= 3 && xi <= 6;
    const base = isWeekend ? 60 : isWorkHour ? 80 : 20;
    const value = Math.round(base + Math.random() * 30);
    data.push({ x: hour, z: day, value });
  });
});

const chartOption = ref({
  grid3D: {
    show: true,
    boxWidth: 20,
    boxHeight: 10,
  },
  xAxis3D: {
    data: hours,
    name: '时段',
  },
  zAxis3D: {
    data: days,
    name: '星期',
  },
  yAxis3D: {
    name: '活跃度',
  },
  series: [
    {
      type: 'heatmap3D',
      name: '活跃度',
      data,
      label: {
        show: false, // 数据点多时隐藏标签
      },
    },
  ],
});
</script>

城市温度分布

展示多个城市的月均温度:

vue
<script setup>
const months = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];
const cities = ['哈尔滨', '北京', '上海', '广州', '海口'];

// 各城市月均温度
const temps = [
  [-18, -14, -4, 6, 14, 20, 23, 21, 13, 3, -7, -15], // 哈尔滨
  [-3, 0, 6, 14, 20, 25, 27, 26, 20, 13, 4, -1],     // 北京
  [4, 6, 10, 16, 21, 25, 28, 28, 24, 18, 12, 6],     // 上海
  [14, 15, 19, 24, 28, 29, 30, 30, 28, 25, 20, 15],  // 广州
  [18, 19, 22, 26, 29, 29, 29, 29, 28, 26, 23, 19],  // 海口
];

const data = [];
cities.forEach((city, zi) => {
  months.forEach((month, xi) => {
    data.push({
      x: month,
      z: city,
      value: temps[zi][xi],
    });
  });
});

const chartOption = ref({
  grid3D: {
    show: true,
    boxWidth: 20,
    boxHeight: 10,
  },
  xAxis3D: {
    data: months,
    name: '月份',
  },
  zAxis3D: {
    data: cities,
    name: '城市',
  },
  yAxis3D: {
    name: '温度(°C)',
  },
  series: [
    {
      type: 'heatmap3D',
      name: '月均温度',
      data,
      label: {
        show: true,
        fontSize: 9,
      },
    },
  ],
});
</script>

自定义柱体高度

通过 tileHeight 调整柱体基础高度:

vue
<script setup>
const chartOption = ref({
  xAxis3D: {
    data: ['产品A', '产品B', '产品C', '产品D'],
    name: '产品',
  },
  zAxis3D: {
    data: ['线上', '线下', '代理'],
    name: '渠道',
  },
  yAxis3D: {
    name: '销量',
  },
  series: [
    {
      type: 'heatmap3D',
      data: [
        { x: '产品A', z: '线上', value: 120 },
        { x: '产品A', z: '线下', value: 100 },
        { x: '产品A', z: '代理', value: 80 },
        { x: '产品B', z: '线上', value: 150 },
        { x: '产品B', z: '线下', value: 130 },
        { x: '产品B', z: '代理', value: 90 },
        // ... 更多数据
      ],
      tileHeight: 0.2, // 增大柱体基础高度
      label: {
        show: true,
        fontSize: 11,
        color: '#333',
      },
    },
  ],
});
</script>

组件属性

属性类型默认值说明
optionRayChartOption-图表配置对象(必填)
widthstring | number'100%'图表宽度
heightstring | number'600px'图表高度

相关文档

基础学习

进阶主题

API 参考

其他图表类型

在线示例