Python:基于sleep_time与ahi的极坐标柱状图颜色映射问题
极坐标图颜色与颜色条问题修复方案
问题分析
- 颜色映射逻辑错误:当前用
np.linspace(0,100, len(ahi))生成颜色值,未关联ahi的实际数值,导致颜色和ahi指标不匹配 - 颜色条创建方式错误:
plt.colorbar(ahi)无法直接生成对应颜色条,需要基于颜色映射规则和数据范围创建ScalarMappable对象 - 图片保存顺序错误:
plt.show()之后调用plt.savefig()会得到空白图,因为show()会关闭并释放画布资源
修复后完整代码
import matplotlib.pyplot as plt import numpy as np from matplotlib.cm import ScalarMappable from matplotlib.colors import Normalize categories = ['Right', 'Supine', 'Left', 'Prone'] sleep_time = [251.5, 40, 130, 15.5] ahi = [12.5, 65.6, 8.2, 0.0] angles = np.linspace(0, 2*np.pi, len(categories), endpoint=False) fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(projection='polar')) # 归一化ahi数值,适配colormap的0-1取值范围 norm = Normalize(vmin=np.min(ahi), vmax=np.max(ahi)) # 根据ahi实际值生成对应颜色 colors = plt.cm.viridis_r(norm(ahi)) # 绘制sleep_time对应柱子 ax.bar(angles, sleep_time, width=1.0, align='center', alpha=0.5, label='睡眠时长') # 绘制关联ahi颜色的柱子 ax.bar(angles, ahi, width=0.4, align='edge', alpha=0.8, color=colors, label='AHI指数') ax.set_xticks(angles) ax.set_xticklabels(categories) ax.legend() # 创建匹配的颜色条 sm = ScalarMappable(norm=norm, cmap=plt.cm.viridis_r) sm.set_array([]) colorbar = fig.colorbar(sm, ax=ax) colorbar.set_label('AHI指数') # 根据ahi实际范围调整刻度,原刻度超出最大值,按需修改 colorbar.set_ticks([0, 30, 60]) # 先保存再显示,避免空白图 plt.savefig('position_vs._ahi.png', dpi=100, bbox_inches='tight') plt.show()
关键修复说明
- 用
Normalize将ahi的实际数值范围映射到颜色映射所需的0-1区间,确保颜色和ahi值一一对应 - 通过
ScalarMappable关联归一化规则与颜色映射,正确生成对应颜色条 - 调整
plt.savefig()到plt.show()之前,解决空白图问题 - 优化柱子透明度和标签,提升可视化可读性
内容的提问来源于stack exchange,提问作者Brett o
相关产品推荐
相关产品推荐

