我只有一组数据的角度值。现在我需要绘制角度分布曲线,即,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程序......?并将其作为分布曲线绘制在图表中
答案 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()
如果您对直方图本身不感兴趣,请忽略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
实际上会返回分档的x
和y
坐标。您可以使用此功能为线图准备数据:
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()
的调用。