如何用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
相关产品推荐
相关产品推荐

