散点图中meshgrid的定义顺序及颜色数组匹配规则
3D散点图颜色数组的排列顺序问题
核心结论
colo数组的排列顺序必须和meshgrid生成的X/Y/Z数组展平后的元素顺序完全一致,也就是遵循numpy默认的**C语言顺序(行优先)**来排列。
具体逻辑
用np.meshgrid(x,y,z)生成三维网格时,默认采用笛卡尔坐标模式(indexing='xy'),生成的X/Y/Z都是(len(y), len(x), len(z))形状的三维数组。ax.scatter(X,Y,Z)绘制时会自动把这三个三维数组展平成一维数组,展平顺序是numpy默认的C顺序——先遍历最内层维度,再依次向外层推进。
所以要让颜色和散点对应正确,最简单的操作是:
- 先把颜色数据整理成和
X同形状的三维数组(比如colo_3d,形状为(6,6,6)) - 再用
colo = colo_3d.flatten()转换成一维数组,这样顺序就完全匹配网格点的顺序了
修正后的示例代码
import numpy as np import matplotlib.pyplot as plt from matplotlib import cm x = [7, 8, 9, 10, 11, 12] y = [0.4, 0.5, 0.6, 0.7, 0.8, 0.9] z = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6] # 先生成和网格同形状的颜色数组,再展平 colo_3d = np.random.normal(0, 1, (len(y), len(x), len(z))) colo = colo_3d.flatten() X,Y,Z = np.meshgrid(x,y,z) fig = plt.figure(figsize=(10, 10)) ax = fig.add_subplot(111, projection='3d') color_map = cm.ScalarMappable(cmap=cm.Greens_r) color_map.set_array(colo) # 必须把colo传给c参数,固定color='green'会覆盖颜色映射,导致不生效 img = ax.scatter(X, Y, Z, marker='s', s=200, c=colo, cmap=cm.Greens_r) plt.colorbar(color_map) plt.show()
关键提醒
- 原代码里的
color='green'会强制所有散点为绿色,完全覆盖颜色映射逻辑,必须改成c=colo才能让每个散点对应colo里的颜色值 - 如果你的颜色数据是按其他顺序生成的,需要先调整成
(len(y), len(x), len(z))的三维结构,再展平,才能保证顺序匹配
内容的提问来源于stack exchange,提问作者eeqesri
相关产品推荐
相关产品推荐

