如何基于3D数组绘制标记大小由数组值决定的3D散点图?
问题分析与解决
你的代码存在两个核心问题:
- 索引越界:你生成的x/y/z范围是0到最大值d,但数组
array的维度是(a,b,c),比如示例中c=2,z的取值到4就超出了数组z维度的有效索引(仅0、1),导致array[x,y,z]报错。 - 坐标点不完整:直接用
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
相关产品推荐
相关产品推荐

