Skip to content

3D 散点图 XYZ

3D 散点图 XYZ 在三维空间中展示点数据的空间分布,每个点由 [x, y, z] 三个坐标值确定位置,适用于聚类分析、空间分布、多变量关系等场景。

快速开始

最简单的 3D 散点图需要提供三维坐标数据:

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

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

const chartOption = ref({
  xAxis3D: { show: true },
  yAxis3D: { show: true },
  zAxis3D: { show: true },
  series: [
    {
      type: 'scatter3DXyz',
      data: [
        [1, 2, 3], // 第1个点的 [x, y, z] 坐标
        [4, 5, 6], // 第2个点的 [x, y, z] 坐标
        [7, 3, 2], // 第3个点的 [x, y, z] 坐标
        [2, 8, 5], // 第4个点的 [x, y, z] 坐标
      ],
    },
  ],
});
</script>

智能默认值

自动配置点大小、颜色渐变、材质效果和光照系统。

核心配置

坐标轴配置

属性类型默认值说明
xAxis3D.showbooleantrue显示 X 轴
yAxis3D.showbooleantrue显示 Y 轴
zAxis3D.showbooleantrue显示 Z 轴

数据配置

属性类型默认值说明
series.datanumber[][]-三维坐标数据(必填)
series.namestring-系列名称
series.labelobject不显示点标签,如 { show: true, distance: 0.3 }

数据格式说明

series.data 是二维数组,每个元素是一个包含 3 个数值的数组 [x, y, z],代表点在三维空间中的坐标。X/Z 轴刻度由数据范围自动生成,Y 轴范围自动取最大值 1.1 倍。

示例:

javascript
data: [
  [1.2, 3.5, 2.8],  // 点1的坐标
  [4.5, 2.1, 5.3],  // 点2的坐标
  [2.8, 6.7, 1.9],  // 点3的坐标
]

样式配置

属性类型默认值说明
series.symbolSizenumber4点大小(半径 = symbolSize / 10,默认半径 0.4)
series.colorstring[]自动分配颜色数组,按索引轮转
材质配置(进阶)

通过 series.itemStyle 配置点的材质效果:

javascript
itemStyle: {
  opacity: 0.9,              // 不透明度(0-1)
  roughness: 0.55,           // 粗糙度(0-1)
  metalness: 0,              // 金属度(0-1)
  clearcoat: 0.1,            // 清漆层强度(0-1)
  clearcoatRoughness: 0.6,   // 清漆层粗糙度(0-1)
  emissiveIntensity: 0.1     // 自发光强度
}
网格配置(可选)

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

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

boxDepth 自动计算

grid3D.boxDepth 会根据数据的 X/Z 范围比例自动计算,手动配置不生效;Y 轴范围(yAxis3D.min/max)也会自动设置为数据的最大值的 1.1 倍。X/Z 轴刻度由数据范围自动生成,无需(也不应)手动指定 xAxis3D.data

:::

常见场景

基础 3D 散点图

展示随机分布的三维点数据:

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

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

// 生成随机3D散点数据
const data = [];
for (let i = 0; i < 50; i++) {
  data.push([
    Math.random() * 10,     // x坐标
    Math.random() * 8 + 1,  // y坐标
    Math.random() * 10,     // z坐标
  ]);
}

const chartOption = ref({
  grid3D: {
    show: true,
    boxWidth: 20,
    boxHeight: 10,
  },
  xAxis3D: { show: true },
  yAxis3D: { show: true },
  zAxis3D: { show: true },
  series: [
    {
      type: 'scatter3DXyz',
      name: '3D散点',
      data,
      symbolSize: 5, // 点大小
      color: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de'],
      itemStyle: {
        opacity: 0.9,
        roughness: 0.55,
        metalness: 0,
        clearcoat: 0.1,
        emissiveIntensity: 0.1,
      },
    },
  ],
});
</script>

聚类分布

展示多个聚类中心的数据分布:

vue
<script setup>
// 生成3个聚类
const clusters = [
  { cx: 2, cy: 3, cz: 2, count: 15 }, // 聚类1中心
  { cx: 7, cy: 7, cz: 7, count: 15 }, // 聚类2中心
  { cx: 5, cy: 2, cz: 8, count: 15 }, // 聚类3中心
];

const data = [];
clusters.forEach(({ cx, cy, cz, count }) => {
  for (let i = 0; i < count; i++) {
    data.push([
      cx + (Math.random() - 0.5) * 2, // 在中心附近随机分布
      cy + (Math.random() - 0.5) * 2,
      cz + (Math.random() - 0.5) * 2,
    ]);
  }
});

const chartOption = ref({
  grid3D: {
    show: true,
    boxWidth: 20,
    boxHeight: 10,
  },
  xAxis3D: { show: true },
  yAxis3D: { show: true },
  zAxis3D: { show: true },
  series: [
    {
      type: 'scatter3DXyz',
      name: '聚类散点',
      data,
      symbolSize: 5,
      color: ['#5470c6', '#91cc75', '#fac858'],
      itemStyle: {
        opacity: 0.9,
        roughness: 0.55,
        metalness: 0,
        clearcoat: 0.1,
      },
    },
  ],
});
</script>

波浪分布

使用数学函数生成波浪形分布:

vue
<script setup>
// 生成波浪分布数据
const data = [];
for (let i = 0; i < 80; i++) {
  const x = Math.random() * 10;
  const z = Math.random() * 10;
  const y = Math.sin(x) * Math.cos(z) * 3 + 4; // 波浪函数
  data.push([x, y, z]);
}

const chartOption = ref({
  grid3D: {
    show: true,
    boxWidth: 20,
    boxHeight: 10,
  },
  xAxis3D: { show: true },
  yAxis3D: { show: true },
  zAxis3D: { show: true },
  series: [
    {
      type: 'scatter3DXyz',
      name: '波浪散点',
      data,
      symbolSize: 5,
      color: ['#4facfe', '#00f2fe', '#43e97b', '#f093fb', '#667eea'],
      itemStyle: {
        opacity: 0.9,
        roughness: 0.5,
        metalness: 0,
        clearcoat: 0.1,
        emissiveIntensity: 0.15, // 增加自发光
      },
    },
  ],
});
</script>

多变量关系分析

展示身高、体重和年龄的三维关系:

vue
<script setup>
const chartOption = ref({
  grid3D: {
    show: true,
    boxWidth: 20,
    boxHeight: 10,
  },
  xAxis3D: {
    show: true,
    name: '身高(cm)',
  },
  yAxis3D: {
    show: true,
    name: '体重(kg)',
  },
  zAxis3D: {
    show: true,
    name: '年龄',
  },
  series: [
    {
      type: 'scatter3DXyz',
      name: '人员数据',
      data: [
        [170, 65, 25], // 身高170cm,体重65kg,年龄25岁
        [175, 70, 30],
        [160, 55, 22],
        [180, 75, 35],
        [165, 60, 28],
        [172, 68, 26],
        [168, 63, 24],
        [178, 73, 32],
      ],
      symbolSize: 6,
      color: ['#5470c6', '#91cc75', '#fac858'],
      itemStyle: {
        opacity: 0.9,
        roughness: 0.5,
        metalness: 0.1,
      },
    },
  ],
});
</script>

组件属性

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

相关文档

基础学习

进阶主题

API 参考

其他图表类型

在线示例