我正在使用matplotlib.pyplot来创建直方图。我实际上并不对这些直方图的情节感兴趣,但对频率和频段感兴趣(我知道我可以编写自己的代码来执行此操作,但更愿意使用此包)。
我知道我可以做到以下几点,
import numpy as np
import matplotlib.pyplot as plt
x1 = np.random.normal(1.5,1.0)
x2 = np.random.normal(0,1.0)
freq, bins, patches = plt.hist([x1,x1],50,histtype='step')
创建直方图。我需要的只是freq[0]
,freq[1]
和bins[0]
。我尝试使用时出现问题,
freq, bins, patches = plt.hist([x1,x1],50,histtype='step')
在一个功能。例如,
def func(x, y, Nbins):
freq, bins, patches = plt.hist([x,y],Nbins,histtype='step') # create histogram
bincenters = 0.5*(bins[1:] + bins[:-1]) # center bins
xf= [float(i) for i in freq[0]] # convert integers to float
xf = [float(i) for i in freq[1]]
p = [ (bincenters[j], (1.0 / (xf[j] + yf[j] )) for j in range(Nbins) if (xf[j] + yf[j]) != 0]
Xt = [j for i,j in p] # separate pairs formed in p
Yt = [i for i,j in p]
Y = np.array(Yt) # convert to arrays for later fitting
X = np.array(Xt)
return X, Y # return arrays X and Y
当我打电话给func(x1,x2,Nbins)
并绘制或打印X
和Y
时,我没有得到我预期的曲线/值。我怀疑它与plt.hist
有关,因为我的情节中有一个部分直方图。
我不知道我是否理解你的问题,但在这里,你有一个非常简单的自制直方图(1D或2D)的例子,每个都在一个函数内,并且适当地调用:
import numpy as np
import matplotlib.pyplot as plt
def func2d(x, y, nbins):
histo, xedges, yedges = np.histogram2d(x,y,nbins)
plt.plot(x,y,'wo',alpha=0.3)
plt.imshow(histo.T,
extent=[xedges.min(),xedges.max(),yedges.min(),yedges.max()],
origin='lower',
interpolation='nearest',
cmap=plt.cm.hot)
plt.show()
def func1d(x, nbins):
histo, bin_edges = np.histogram(x,nbins)
bin_center = 0.5*(bin_edges[1:] + bin_edges[:-1])
plt.step(bin_center,histo,where='mid')
plt.show()
x = np.random.normal(1.5,1.0, (1000,1000))
func1d(x[0],40)
func2d(x[0],x[1],40)
当然,您可以检查数据的居中是否正确,但我认为该示例显示了有关此主题的一些有用的信息。
我的建议:尽量避免代码中出现任何循环!他们杀死了表演。如果你看,在我的例子中没有循环。 python数值问题的最佳实践是避免循环! Numpy有许多C实现的功能,可以完成所有硬循环工作。
没有。
但你可以绕过pyplot:
import matplotlib.pyplot
fig = matplotlib.figure.Figure()
ax = matplotlib.axes.Axes(fig, (0,0,0,0))
numeric_results = ax.hist(data)
del ax, fig
它不会影响活动轴和数字,所以即使在绘制其他内容的中间也可以使用它。
这是因为plt.draw_something()
的任何使用都会将绘图放在当前轴上 - 这是一个全局变量。