如何在polar极坐标图中为饼状切片分配预定义半径长度?
问题原因
你现有代码的错误集中在以下几点:
- 循环逻辑错误:你写的for循环只是反复给
radius变量赋值,最终只保留了倒数第二条数据的半径值,没有把所有半径组成的数组传入ax.bar方法 - 切片宽度计算错误:4条数据每个切片占90度,对应弧度为
2 * np.pi / 4 = np.pi / 2,你之前的width = np.pi /4 *100数值远大于实际需要,导致所有切片重叠成完整圆形 - 颜色生成逻辑错误:原来仅基于最后一个radius值生成单一颜色,没有为每个切片单独生成对应颜色
- 测试数据误差:你定义values时cat的半径写的是7,不符合要求的最大半径6,需要修正为6
修正后的完整代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt index= ['A','B','C','D'] columns= ['radius','name'] # 修正cat的半径为6符合最大半径要求 values= [[4, "hamster"],[5, "fish"],[0, "dog"],[6, "cat"]] df= pd.DataFrame(values, index=index, columns=columns, dtype= float) print(df) # 计算切片参数 N = df.shape[0] # 每个切片的起始角度 theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False) # 直接读取所有半径组成数组,无需循环 radius = df['radius'].values # 每个切片宽度为90度对应弧度 width = 2 * np.pi / N # 基于每个半径生成对应颜色,最大半径为6做归一化 colors = plt.cm.viridis(radius / 6.) ax = plt.subplot(projection='polar') # 直接传入数组批量绘制所有切片 ax.bar(theta, radius, width=width, bottom=0.0, color=colors, alpha=0.5) # 设置极轴半径范围0-6符合要求 ax.set_ylim(0,6) plt.show()
运行效果说明
代码运行后会生成4个等宽90度的切片,其中dog对应半径为0不会显示,实际可见3个切片,极轴最大半径为6,完全符合你的预期需求。
内容的提问来源于stack exchange,提问作者veila
相关产品推荐
相关产品推荐

