在圆上绘制点,其中每个点根据它出现的频率离原点更远。奇怪的行为
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()
我有大量以度数(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()