如何在matplotlib中绘制极轴hist2d/hexbin?

如何在matplotlib中绘制极轴hist2d/hexbin?,matplotlib,histogram,scatter-plot,polar-coordinates,Matplotlib,Histogram,Scatter Plot,Polar Coordinates,我有一个随机向量(随机长度和随机角度),希望通过hist2d或hexbin绘制其近似PDF(概率密度函数)。不幸的是,它们似乎不适用于极坐标图,以下代码不会产生任何结果: import numpy as np import matplotlib.pyplot as plt # Generate random data: N = 1024 r = .5 + np.random.normal(size=N, scale=.1) theta = np.pi / 2 + np.random.norma

我有一个随机向量(随机长度和随机角度),希望通过
hist2d
hexbin
绘制其近似PDF(概率密度函数)。不幸的是,它们似乎不适用于极坐标图,以下代码不会产生任何结果:

import numpy as np
import matplotlib.pyplot as plt

# Generate random data:
N = 1024
r = .5 + np.random.normal(size=N, scale=.1)
theta = np.pi / 2 + np.random.normal(size=N, scale=.1)

# Plot:
ax = plt.subplot(111, polar=True)
ax.hist2d(theta, r)
plt.savefig('foo.png')
plt.close()
我希望它看起来像这样:只在极坐标系下。迄今为止最接近的结果是彩色散点图:

有没有更好的方法让它更像用hist2d生成的真实PDF?似乎相关(生成的图像与预期的一样),但看起来很凌乱。

一种方法是使用:

结果:

请注意,柱状图还没有通过箱子的面积进行标准化,而箱子的面积在极坐标中不是常数。靠近原点,箱子非常小,所以其他类型的啮合可能更好

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

# Generate random data:
N = 1024
r = .5 + np.random.normal(size=N, scale=.1)
theta = np.pi / 2 + np.random.normal(size=N, scale=.1)

# Plot:
ax = plt.subplot(111, polar=True)

# Using approach from:
# https://stackoverflow.com/questions/20105364/how-can-i-make-a-scatter-plot-colored-by-density-in-matplotlib
theta_r = np.vstack([theta,r])
z = gaussian_kde(theta_r)(theta_r)

ax.scatter(theta, r, c=z, s=10, edgecolor='')

plt.savefig('foo.png')
plt.close()
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

# Generate random data:
N = 10000
r = .5 + np.random.normal(size=N, scale=.1)
theta = np.pi / 2 + np.random.normal(size=N, scale=.1)


# Histogramming
nr = 50
ntheta = 200
r_edges = np.linspace(0, 1, nr + 1)
theta_edges = np.linspace(0, 2*np.pi, ntheta + 1)
H, _, _ = np.histogram2d(r, theta, [r_edges, theta_edges])

# Plot
ax = plt.subplot(111, polar=True)
Theta, R = np.meshgrid(theta_edges, r_edges)
ax.pcolormesh(Theta, R, H)
plt.show()