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')
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')