如何在python中绘制角度频率分布曲线

时间:2017-05-24 04:31:48

标签: python distribution angle curve

我只有一组数据的角度值。现在我需要绘制角度分布曲线,即,x轴上的角度v / s在y轴上出现的角度/频率。 这些是为一组数据整理的角度: -

[98.1706427, 99.09896751, 99.10879006, 100.47518838, 101.22770381, 101.70374296,
103.15715294, 104.4653976,105.50441485, 106.82885361, 107.4605319, 108.93228646,
111.22463712, 112.23658018, 113.31223886, 113.4000603, 114.14565594, 114.79809084,
115.15788861, 115.42991416, 115.66216071, 115.69821092, 116.56319054, 117.09232139,
119.30835385, 119.31377834, 125.88278338, 127.80937901, 132.16187185, 132.61262906,
136.6751744, 138.34164387,]

我怎么能这样做.. ?? 我怎么能为此编写一个python程序......?并将其作为分布曲线绘制在图表中

2 个答案:

答案 0 :(得分:0)

修改

如果您还想要一个折线图,最好使用numpy生成直方图,然后将该信息用于该行:

from matplotlib import pyplot as plt
import numpy as np

angles = [98.1706427, 99.09896751, 99.10879006, 100.47518838, 101.22770381,
101.70374296, 103.15715294, 104.4653976, 105.50441485, 106.82885361, 
107.4605319, 108.93228646, 111.22463712, 112.23658018, 113.31223886, 
113.4000603, 114.14565594, 114.79809084, 115.15788861, 115.42991416, 
115.66216071, 115.69821092, 116.56319054, 117.09232139, 119.30835385, 
119.31377834, 125.88278338, 127.80937901, 132.16187185, 132.61262906,
136.6751744, 138.34164387, ] 


hist,edges = np.histogram(angles, bins=20)
bin_centers = 0.5*(edges[:-1] + edges[1:])
bin_widths = (edges[1:]-edges[:-1])



plt.bar(bin_centers,hist,width=bin_widths)
plt.plot(bin_centers, hist,'r')
plt.xlabel('angle [$^\circ$]')
plt.ylabel('frequency')
plt.show()

这看起来像这样: angle histogram with curve

如果您对直方图本身不感兴趣,请忽略plt.bar(bin_centers,hist,width=bin_widths)行。

<强> EDIT2

我没有在平滑的直方图中看到科学价值。如果增加直方图的分辨率(bins命令中的np.histogram参数),它可能会发生很大变化。例如,如果增加bin计数,可能会出现新峰值,或者如果减少bin计数,则可能会将两个峰值合并为一个峰值。记住这一点,平滑直方图曲线表明您拥有的数据比您多。但是,如果你真的必须,你可以按照answer中所解释的那样平滑曲线,即

from scipy.interpolate import spline
x = np.linspace(edges[0], edges[-1], 500)
y = spline(bin_centers, hist, x)

然后在y上点x

答案 1 :(得分:0)

功能hist实际上会返回分档的xy坐标。您可以使用此功能为线图准备数据:

y, x, _ = plt.hist(angles) # No need for the 3rd return value
xc = (x[:-1] + x[1:]) / 2 # Take centerpoints
# plt.clf()
plt.plot(xc, y)
plt.show() # Etc.

你最终会得到直方图和线图。如果不希望这样做,请在绘制线条之前清除画布,方法是取消对clf()的调用。