[英]Plotting points on a circle, where each point is further from the origin based on how often it is present. Weird behavior
我有很多希望以度為單位(0到360)的色相值。
這是一些“測試”數據。 我的真實數據與此類似。
# 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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.