如何根据自定义数值列表为极坐标图单元格着色(内层圆柱不切片)
解决方案
核心思路
- 内层完整环形:直接绘制覆盖360度的环形,避免拆分切片
- 数值关联渐变着色:利用Matplotlib颜色映射,将自定义数值归一化后映射为蓝到红的渐变色彩
完整代码
import matplotlib.pyplot as plt import numpy as np from matplotlib.colors import Normalize # 自定义参数 layer_height = 10 / 3 # 每层高度 n_angles = 30 # 外层/中间层的切片数量 # 自定义数值列表:[内层数值, 中间层30个数值, 外层30个数值] values = [np.random.uniform(0, 10) for _ in range(1 + n_angles * 2)] # 数值归一化 + 蓝到红渐变映射 norm = Normalize(vmin=np.min(values), vmax=np.max(values)) cmap = plt.cm.RdBu_r # RdBu_r实现蓝到红,RdBu默认是红到蓝 # 创建极坐标图 fig = plt.figure() ax = fig.add_axes([0.1, 0.1, 0.8, 0.8], polar=True) # 绘制内层完整环形 inner_val = values[0] ax.bar(0, layer_height, width=2*np.pi, bottom=0, color=cmap(norm(inner_val)), edgecolor=cmap(norm(inner_val))) # 绘制中间层切片 for i in range(n_angles): angle = i * 2 * np.pi / n_angles val = values[1 + i] ax.bar(angle, layer_height, width=2*np.pi/n_angles, bottom=layer_height, color=cmap(norm(val)), edgecolor=cmap(norm(val))) # 绘制外层切片 for i in range(n_angles): angle = i * 2 * np.pi / n_angles val = values[1 + n_angles + i] ax.bar(angle, layer_height, width=2*np.pi/n_angles, bottom=2*layer_height, color=cmap(norm(val)), edgecolor=cmap(norm(val))) # 轴样式设置 plt.ylim(0, 10) ax.set_yticks([]) # 添加颜色条展示数值与色彩对应关系 sm = plt.cm.ScalarMappable(norm=norm, cmap=cmap) sm.set_array([]) fig.colorbar(sm, ax=ax, shrink=0.8) plt.show()
关键细节说明
- 内层环形通过
width=2*np.pi实现360度完整覆盖,不会被拆分 Normalize将自定义数值映射到0-1区间,确保颜色渐变均匀匹配数值范围- 颜色条用于直观展示数值与色彩的对应关系,方便解读热力效果
内容的提问来源于stack exchange,提问作者Michele Pastena
相关产品推荐
相关产品推荐

