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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:54:04