如何在matplotlib的极坐标2D直方图中创建弧形条?

3

我正在使用matplotlib和以下代码(改编自另一个问题的答案)在Python 3.7中绘制极坐标2d直方图:

import numpy as np
import matplotlib.pyplot as plt

# input data
azimut = np.random.rand(3000)*2*np.pi
radius = np.random.rayleigh(9, size=3000)

# binning
rbins = np.linspace(0, radius.max(), 10)
abins = np.linspace(0, 2*np.pi, 10)

# histogram
hist, _, _ = np.histogram2d(azimut, radius, bins=(abins, rbins))
A, R = np.meshgrid(abins, rbins)

# plot
fig, ax = plt.subplots(subplot_kw=dict(projection="polar"))

pc = ax.pcolormesh(A, R, hist.T, cmap='inferno')
fig.colorbar(pc)

plt.show()

生成以下图表:

enter image description here

由于较大的箱子大小,极地投影看起来更像是一个多边形而不是一个圆形。
有没有办法绘制出曲线的箱子而不是直线的箱子?即使箱子变大,图形也始终是圆形,而不会变成多边形?
Matplotlib解决方案最好,但其他方案也可以。
非常感谢您的帮助。
1个回答

4
为了获得圆润的外观,可以将网格细分为更多角度。请注意,np.linspace(0, 2 * np.pi, 10)创建9个bin(和10个边界)。对于细分网格,您需要例如90个bin,因此需要91个边界。直方图值需要重复相同的因素。
下面的代码出于调试目的使用不同的颜色映射。可选网格突出显示原始边界。
import numpy as np
import matplotlib.pyplot as plt

# input data
azimut = np.random.rand(3000) * 2 * np.pi
radius = np.random.rayleigh(9, size=3000)

# binning
rbins = np.linspace(0, radius.max(), 7)
abins = np.linspace(0, 2 * np.pi, 10)
subdivs = 10
abins2 = np.linspace(0, 2 * np.pi, (len(abins) - 1) * subdivs + 1)

# histogram
hist, _, _ = np.histogram2d(azimut, radius, bins=(abins, rbins))
A1, R1 = np.meshgrid(abins, rbins)
A2, R2 = np.meshgrid(abins2, rbins)

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(10, 4), subplot_kw=dict(projection="polar"))

# plot with original mesh
pc1 = ax1.pcolormesh(A1, R1, hist.T, cmap='hsv')
ax1.tick_params(axis='y', labelcolor='white')
ax1.set_xticks(abins[:-1])
fig.colorbar(pc1, ax=ax1)

# plot with subdivided mesh
pc2 = ax2.pcolormesh(A2, R2, np.repeat(hist.T, subdivs, axis=1), cmap='hsv')
ax2.tick_params(axis='y', labelcolor='white')
ax2.set_xticks(abins[:-1])
ax2.set_yticks(rbins, minor=True)
ax2.grid(axis='x', color='white')
ax2.grid(axis='y', which='minor', color='white')
fig.colorbar(pc2, ax=ax2)

plt.tight_layout()
plt.show()

rounded pcolormesh on polar axes


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接