在python中,如何使用直方图和跟随每个峰值中点的曲线来绘制状态密度?

在python中,如何使用直方图和跟随每个峰值中点的曲线来绘制状态密度?,python,matplotlib,Python,Matplotlib,我想绘制如上图(右下角)所示的状态密度,其中直方图的一般形状显示在曲线中。该曲线遵循峰值中点形成的一般形状。不幸的是,我只能像右上角那样绘制DOS曲线,曲线看起来就像直方图本身。有没有办法用对应于直方图峰值中点的点来拟合曲线 这张照片是从。 本征态: [ 0.81 0.81 0.81 0.75 0.75 0.75 0.54 0.54 0.54 0.47 0.47 0.47 0.33 0.33 0.75 0.81 0.27 0.27 0.33 0.15 0.15

我想绘制如上图(右下角)所示的状态密度,其中直方图的一般形状显示在曲线中。该曲线遵循峰值中点形成的一般形状。不幸的是,我只能像右上角那样绘制DOS曲线,曲线看起来就像直方图本身。有没有办法用对应于直方图峰值中点的点来拟合曲线

这张照片是从。 本征态: [ 0.81 0.81 0.81 0.75 0.75 0.75 0.54 0.54 0.54 0.47 0.47 0.47 0.33 0.33 0.75 0.81 0.27 0.27 0.33 0.15 0.15 0.27 0.54 0.15 0.47 0.33 -0.06 -0.06 -0.06 0.27 0.15 -0.08 -0.06 -0.2 -0.2 -0.2 -1.03 -0.08 -0.08 -0.27 -0.2 -1.03 -1.03 -1.03 -0.27 -0.27 -0.93 -0.93 -0.36 -0.36 -0.4 -0.4 -0.4 -0.27 -0.93 -0.36 -0.36 -0.4 -0.93 -0.93 -1.03 -1.03 -0.93 -1.03 -1.03 -1.03 -1.03 -0.93 -0.08 -0.93 -1.03 -1.03 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -[0.75-0.75-0.75-0.75-0.75-0.75-0.75-0.75-0.75-0.75-0.75-0.75-0.75]

我的代码:

bins = 100

plt.figure(figsize=[8,5])
plt.rcParams['axes.titlesize'] = 17
plt.rcParams.update({'font.size': 15})
dN = plt.hist(Eig_nn, bins)
plt.xlabel('Eigenvalues')
plt.ylabel('N')
plt.title('All eigenvalues')
plt.show()

# DOS

dE = (max(Eig_nn) - min(Eig_nn)) / bins
DOS = dN[0]/dE
E = np.linspace(-6,4,bins)

plt.figure(figsize=[8,5])
plt.rcParams['axes.titlesize'] = 17
plt.rcParams.update({'font.size': 15})
plt.plot(E, DOS)
plt.xlabel('E')
plt.ylabel('DOS')
plt.title('All eigenvalues')
plt.show()

我不确定演示图是如何生成的。也许它只是用平滑的曲线连接直方图的顶部

它看起来有点像一辆汽车。这样的曲线可以由scipy's生成。它的第一个参数是数据点,第二个参数确定每个高斯点的宽度。最佳宽度取决于数据以及您希望如何解释它们。对于本例,0.1左右的值似乎足够了。目前还不清楚如何最好地将直方图与kde对齐,因此下面的代码使用辅助y轴绘制kde

要进行实验的一些代码:

从matplotlib导入pyplot作为plt
将numpy作为np导入
从scipy.stats导入高斯_kde
Eig_nn=np.array([…])
垃圾箱=100
plt.rcParams.update({'font.size':15})
图,ax1=plt.子批次(图大小=[8,5])
bin_值,bin_lims,_patches=plt.hist(Eig_nn,bins,color='dodgerblue')
x=np.linspace(bin_lims[0]-0.2,bin_lims[-1]+0.2500)#创建一个x轴
kde=高斯分布(Eig_nn,0.1)
ax2=ax1.twinx()#为kde创建一个次轴
ax2.plot(x,kde(x),color='crimson')
ax1.set_xlim(x[0],x[-1])#设置严格限制
ax1.set_xlabel(‘特征值’)
ax1.set_ylabel('N')
ax2.set_ylabel('kde')
ax2.设置y轴(ymin=0)#将次y轴的零点置于底部
plt.title('所有特征值',fontsize=20)
plt.show()

如果您能提供一个小片段,说明Eig_nn的值是什么以及当前输出是什么样子的,这将有助于人们提供一个示例。Seaborn的似乎值得一看。谢谢,我已经添加了我的本征态和当前输出。至于kdeplot,我已经试过了,但是输出不是我想要的。非常感谢你,对不起,我是新来的。我会的!多谢各位