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

如何用Matplotlib绘制按高度自定义颜色并显示色阶的3D柱状图

解决Matplotlib 3D柱状图按高度上色并添加色阶的问题

我来帮你实现这个需求!要给每个3D柱形根据高度设置不同颜色并添加色阶,我们可以借助Matplotlib的颜色映射(colormap)和归一化工具来完成。下面是修改后的完整代码,我会一步步解释关键部分:

import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import Normalize
import numpy as np

# 初始化画布和3D轴
fig_stat = plt.figure(dpi=100)
ax_stat = fig_stat.add_subplot(111, projection='3d')

# 柱形的x、y、初始z位置
xpos = [1, 1, 1, 3, 3, 3, 5, 5, 5]
ypos = [1, 3, 5, 1, 3, 5, 1, 3, 5]
zpos = [0, 0, 0, 0, 0, 0, 0, 0, 0]

# 柱形的高度(这里用示例值,你替换成自己的dz数组即可)
dz = [2, 5, 3, 7, 4, 6, 1, 8, 9]
# 柱形的宽度和深度(假设每个柱形的x方向宽度是1,y方向深度是1)
dx = [1]*9
dy = [1]*9

# 1. 选择颜色映射并归一化高度值
# 选一个你喜欢的colormap,比如'viridis'、'plasma'、'coolwarm'都可以
cmap = cm.get_cmap('viridis')
# 把dz的值归一化到0-1范围,对应色阶的刻度
norm = Normalize(vmin=np.min(dz), vmax=np.max(dz))

# 2. 为每个柱形生成对应的颜色
colors = [cmap(norm(height)) for height in dz]

# 3. 绘制每个柱形,设置对应的facecolor
for x, y, z, d_x, d_y, d_z, color in zip(xpos, ypos, zpos, dx, dy, dz, colors):
    ax_stat.bar3d(x, y, z, d_x, d_y, d_z, facecolor=color, edgecolor='white')

# 4. 添加色阶(colorbar)
# 创建一个ScalarMappable来关联颜色映射和归一化,用于生成色阶
sm = cm.ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([])  # 只需要关联映射,不需要额外数据
fig_stat.colorbar(sm, ax=ax_stat, label='柱形高度')

# 调整轴标签和视角
ax_stat.set_xlabel('X轴')
ax_stat.set_ylabel('Y轴')
ax_stat.set_zlabel('高度')
ax_stat.view_init(elev=30, azim=45)  # 调整视角让图更清晰

plt.tight_layout()
plt.show()

关键部分解释:

  • 颜色映射与归一化:Normalize会把你的dz数组中的最小值映射为0,最大值映射为1,这样每个高度值都能对应到颜色映射中的一个颜色。
  • 逐个绘制柱形:因为要给每个柱形单独设置颜色,所以我们用循环来绘制每个bar3d,而不是一次性传入数组。
  • 色阶添加:ScalarMappable是连接颜色映射和色阶的桥梁,通过它我们可以把高度对应的颜色范围显示在色阶条里,方便查看高度和颜色的对应关系。

你只需要把示例中的dz数组替换成你自己的真实高度数据即可,也可以根据喜好更换颜色映射(比如把'viridis'换成'coolwarm'来得到冷暖对比的颜色)。

内容的提问来源于stack exchange,提问作者Tracy Gao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:40:43