如何使用Matplotlib在环形柱状图上绘制矩形
在Matplotlib环形柱状图(极坐标)上绘制矩形的方法
在极坐标下直接用常规2D的Rectangle类会因为坐标转换导致图形扭曲,要实现目标效果,需要通过定义极坐标范围的顶点,转换为笛卡尔坐标后绘制多边形,具体步骤如下:
1. 导入依赖库
import matplotlib.pyplot as plt import matplotlib.patches as patches import numpy as np
2. 创建环形柱状图(极坐标基础图)
# 创建极坐标子图 fig, ax = plt.subplots(subplot_kw={'projection': 'polar'}, figsize=(8,8)) # 示例环形柱状图数据 theta = np.linspace(0, 2*np.pi, 6, endpoint=False) # 6个柱子的角度 radii = [5, 7, 6, 8, 9, 7] # 每个柱子的高度(半径差) width = 2*np.pi / 6 # 每个柱子的角度宽度 # 绘制环形柱状图(bottom设置内圈半径,形成环形) ax.bar(theta, radii, width=width, bottom=3, edgecolor='white', facecolor='#6699cc') # 调整极坐标显示参数 ax.set_ylim(0, 10) ax.set_yticks([]) # 隐藏半径刻度 ax.set_xticks(theta)
3. 绘制极坐标下的矩形区域
要绘制的矩形对应极坐标中的角度范围和半径范围,我们可以通过生成该区域的四个顶点,转换为笛卡尔坐标后填充或绘制多边形:
# 定义目标矩形的极坐标范围 theta_start = 0 # 起始角度 theta_end = np.pi/3 # 结束角度 r_min = 4 # 内圈半径 r_max = 6 # 外圈半径 # 生成矩形四个顶点的极坐标(闭合) polar_points = np.array([ [theta_start, r_min], [theta_start, r_max], [theta_end, r_max], [theta_end, r_min], [theta_start, r_min] ]) # 转换为笛卡尔坐标 x = polar_points[:, 1] * np.cos(polar_points[:, 0]) y = polar_points[:, 1] * np.sin(polar_points[:, 0]) # 填充矩形区域(可调整颜色、透明度) ax.fill(x, y, color='#ff4444', alpha=0.6) # 可选:绘制矩形边框 ax.plot(x, y, color='#cc0000', linewidth=2)
关键说明
- 极坐标下的“矩形”本质是环形扇形区域,由两条固定角度的径向线和两条固定半径的圆弧围成。
- 常规
Rectangle类基于笛卡尔坐标,在极坐标投影下会被自动转换,导致形状扭曲成弧形,因此必须通过顶点坐标转换的方式实现。
运行上述代码后,就能得到类似目标效果的图形。
内容的提问来源于stack exchange,提问作者csg
相关产品推荐
相关产品推荐

