Построение точек на окружности, где каждая точка находится дальше от начала координат в зависимости от того, как часто она присутствует.Странное поведение - PullRequest
0 голосов
/ 08 июня 2018

У меня есть большое количество значений оттенков, выраженных в градусах (от 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()

enter image description here

Далее я хочу разместить свои данные на этомкруг.

# 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()

enter image description here

Хммм.Итак, значения нанесены на круг.Но теперь это выглядит так, как будто точки более или менее одинаково вероятны в пределах спреда.Я хотел бы показать данные таким образом, чтобы вы могли видеть распределение данных тоже.Что-то вроде нормальной кривой колокола.То есть я хотел бы что-то вроде этого (не обращайте внимания на плохие навыки рисования)

enter image description here

На этом изображении, дальше от черногокруг, тем чаще мы находим эти данные точек.В основном, круглая нормальная кривая колокола.

Я пытался умножить каждую точку данных на значение, которое увеличивается с увеличением вероятности для этого значения.Т.е. чем вероятнее точка данных, тем дальше она находится от черного круга.(Просто как кривая колокола, но не по кругу), но это дает мне эти странные результаты.

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

enter image description here

Этот вывод не тот, который я намеревался.Я не уверен, где я иду не так (моя геометрия и математика никогда не были моей сильной стороной).Как я могу сделать свой желаемый сюжет?

Мои данные выглядят так:

enter image description here

1 Ответ

0 голосов
/ 08 июня 2018

Возможно, вы бы предпочли показать оценку плотности ядра вашего распределения?

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

enter image description here

Возможно, вы также хотите показать это наполярный график.

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

enter image description here

...