在圆上绘制点,其中每个点根据它出现的频率离原点更远。奇怪的行为

Plotting points on a circle, where each point is further from the origin based on how often it is present. Weird behavior

我有大量以度数(0 到 360)表示的色调值,我希望将它们绘制在圆上。

这是一些 'test' 数据。我的真实数据与此类似。

# create values with a normal distributions. 
mu = 0.5
sigma = 0.02
values = np.random.normal(mu,sigma,10000)
values = values*360

现在我创建一个简单的圆。

# create a circle
circle = np.linspace(0,2*np.pi,1000)
x = np.sin(circle)
y = np.cos(circle)
plt.plot(x,y,color='black')
plt.axis('equal')
plt.show()

接下来,我希望将我的数据绘制到这个圆圈上。

# plot values on circle
x = []
y = []
for i in values:
    x.append(round(math.cos(math.radians(i)),2))
    y.append(round(math.sin(math.radians(i)),2))
plt.scatter(x,y,color='red')
plt.show()

嗯。好的,所以这些值被绘制到圆圈上。但现在看起来这些点在价差内的可能性或多或少是相等的。我想以这样一种方式显示数据,您也可以看到数据的分布。有点像正常的钟形曲线。也就是我想要这样的东西(不介意画的不好)

在这张图片中,离黑圈越远,我们就越容易找到这些数据点。基本上,圆形正态钟形曲线。

我尝试将每个数据点乘以一个值,该值随着该值的可能性增加而增加。即,数据点的可能性越大,它离黑圈越远。 (就像钟形曲线,但不是圆圈)但它给了我这些奇怪的结果。

uniqueX = set(x)
uniqueY = set(y)
countx = max([x.count(i) for i in set(x)])
county = min([y.count(i) for i in set(y)])

ofset = [((1/countx*x.count(i))+1) for i in x]
x = [x*ofset[ii] for ii,x in enumerate(x)]
y = [x*ofset[ii] for ii,x in enumerate(y)]

plt.scatter(x,y,color='red')
plt.show()

这个输出不是我想要的。我不确定我哪里出错了(我的几何和数学从来都不是我的强项)。我怎样才能制作我想要的情节?

我的数据是这样的:

您可能更愿意显示分布的核密度估计值?

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

mu = 0.5
sigma = 0.1
values = np.random.normal(mu,sigma,10000)
values = values

phi = np.linspace(-np.pi,np.pi,1000)
xc = np.sin(phi)
yc = np.cos(phi)
plt.plot(xc,yc,color='black')


kde = gaussian_kde(values)
r = kde(phi)

# scale the kde by 1/10 to make it fit to the screen
x = (1+r/10.)*np.cos(phi)
y = (1+r/10.)*np.sin(phi)
plt.plot(x,y,color='red', zorder=0)


plt.axis('equal')
plt.show()

可能您还想在极坐标图上显示它。

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

mu = 0.5
sigma = 0.1
values = np.random.normal(mu,sigma,10000)
values = values

phi = np.linspace(-np.pi,np.pi,1000)
r0 = np.ones_like(phi)

fig, ax = plt.subplots(subplot_kw=dict(projection="polar"))
ax.plot(phi,r0,color='black')


kde = gaussian_kde(values)
r = kde(phi)

# scale the kde by 1/10 to make it fit to the screen
ax.plot(phi,(1+r/10),color='red', zorder=0)

ax.set_rgrids([])
ax.set_rlim(ymax=1.2*(1+r/10).max())
plt.show()