Matplotlib 在极坐标图中使用 Wedge()

Matplotlib using Wedge() in polar plots

TL/DR:如何在极坐标中使用Wedge()

我正在生成极坐标 (r, theta) 中的二维直方图。在不同的 r 值下,可以有不同数量的 theta 值(以保持相同面积大小的箱)。要绘制我目前正在使用 pcolormesh() 的颜色编码箱,请调用每个径向环。这工作正常,但在图的中心附近可能只有 3 个箱子(在 theta space 中每个 120 度“宽”),pcolormesh() 绘制的三角形不会“扫”满圆弧(只是用直线连接两个外圆弧点)。

我找到了一种使用 ax.bar() 调用的解决方法,每个径向环一个,并传入 theta 值数组(每个 bin 呈现为一个单独的条)。但是当做 90 个环,每个环有 3 到 360 个 theta bins 时,它非常慢(分钟)。

我尝试使用 Wedge() 补丁,但无法让它们在极投影中正确渲染。以下是显示这两种方法的示例代码:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Wedge
from matplotlib.collections import PatchCollection

# Theta coordinates in degrees

theta1=45
theta2=80

# Radius coordinates

r1 = 0.4
r2 = 0.5

# Plot using bar()

fig, ax = plt.subplots(figsize=[6,6], subplot_kw={'projection': 'polar'})
theta_mid = np.deg2rad((theta1 + theta2)/2)
theta_width = np.deg2rad(theta2 - theta1)
height = r2 - r1
ax.bar(x=theta_mid, height = height, width=theta_width, bottom=r1)
ax.set_rlim(0, 1)
plt.savefig('bar.png')

# Plot using Wedge()

fig, ax = plt.subplots(figsize=[6,6], subplot_kw={'projection': 'polar'})
patches = []
patches.append( Wedge(center=(0, 0), r = r1, theta1=theta1, theta2=theta2, width = r2-r1, color='blue'))
p = PatchCollection(patches)
ax.add_collection(p)
ax.set_rlim(0, 1)
plt.savefig('wedge.png')

每个的输出是:

酒吧

楔形

我试过对楔形使用弧度(因为极坐标图通常需要以弧度为单位的角度值)。那没有帮助。

我在使用 Wedge 时是否遗漏了什么?如果我将数千个 Wedges 添加到我的 Patch 集合中,我应该期望它会比 bar() 更快吗?

认为这是一个实际的错误,我在 matplotlib 上打开了这个问题 https://github.com/matplotlib/matplotlib/issues/22717,其中一位维护者很好地指出我应该使用 Rectangle() 而不是 Wedge()

他们提供的解决方案是

from matplotlib.patches import Rectangle

fig, ax = plt.subplots(figsize=[6,6], subplot_kw={'projection': 'polar'})
p = PatchCollection([Rectangle((np.deg2rad(theta1), r1), theta_width, height, color='blue')])
ax.add_collection(p)
ax.set_rlim(0, 1)
plt.savefig('wedge.png')