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

如何基于3D数组绘制标记大小由数组值决定的3D散点图?

问题分析与解决

你的代码存在两个核心问题:

  1. 索引越界:你生成的x/y/z范围是0到最大值d,但数组array的维度是(a,b,c),比如示例中c=2,z的取值到4就超出了数组z维度的有效索引(仅0、1),导致array[x,y,z]报错。
  2. 坐标点不完整:直接用linspace生成的一维x/y/z传入scatter,只会绘制对应位置的点(比如x[0],y[0],z[0]这类单点组合),而不是所有整数坐标的笛卡尔积组合。

修正后的代码

import numpy as np 
import matplotlib.pyplot as plt

a = 3
b = 4
c = 2

# 生成每个维度的有效整数索引
x = np.arange(a)
y = np.arange(b)
z = np.arange(c)

# 生成所有坐标组合并转为一维数组(符合scatter的输入要求)
X, Y, Z = np.meshgrid(x, y, z, indexing='ij')
X_flat = X.flatten()
Y_flat = Y.flatten()
Z_flat = Z.flatten()

# 生成目标三维数组
array = np.random.randint(0, 10, (a, b, c))
print(array)

fig = plt.figure()
ax = fig.add_subplot(projection='3d')

# 用数组展平后的值作为标记大小
ax.scatter(X_flat, Y_flat, Z_flat, s=array.flatten())
plt.show()

关键说明

  • 用np.arange生成每个维度的有效索引,避免出现超出数组范围的索引值。
  • np.meshgrid配合indexing='ij'生成和数组维度完全对应的坐标网格,确保每个(x,y,z)都对应array的一个元素。
  • 将坐标网格和数组都展平为一维,匹配scatter对输入参数的要求(x/y/z与s必须是长度相同的一维数组)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:45:34