线条以值的图形为样条但是y

时间:2012-01-29 16:42:58

标签: python linux numpy matplotlib

我想生成如下链接

的图表

http://en.wikipedia.org/wiki/Reaction_coordinate

从安装的python库计算生成的图形。 我希望线条顺畅,类型为cspline gnuplot

值E_ads = 234.4211,E_dis = 0.730278和E_reac = -0.8714

任何人都可以帮助我

from ase import *
from ase.calculators.jacapo import *
import Gnuplot as gp
# -- Read in all energies
datadict = {'H2O' :'water.nc',
            'Pt' :'out-Pt.nc',
            'H2OPt' :'H2O.Pt.nc',
            'OHPt' :'OHPt.nc',
            'HPt' :'HPt.nc',
}
E = {}

for label, file in datadict.items():
    print 'Reading energy for %5s from file %20s' % (label, file),
    atoms = Jacapo.read_atoms(file)
    E[label] = atoms.get_potential_energy()
    print '\tE = %14.6f eV'% E[label]
print     

# -- Calculate adsorption and disassociation energies
E_ads = (E['H2OPt'] - 2*E['H2O'] - E['Pt'])/2
print 'H2O adsorption energy on Pt:'
print 'E_ads =', E_ads, 'eV\n'

E_dis = E['HPt'] - E['Pt'] + E['OHPt'] - E['Pt'] - E['H2O']
print 'H2O -> OH + H disassociation energy on Pt:'
print 'E_dis =', E_dis, 'eV\n'

E_reac = E['H2OPt'] - E['HPt'] - E['OHPt'] + E['Pt']
print 'H2O@Pt -> OH@Pt +H@Pt reaction energy on Pt:'
print 'E_reac =', E_reac, 'eV\n'
# -- Collect reaction path
Epath = np.asarray([1.0, E_ads, E_dis, E_reac])
PathLabels= ['']
# -- Plot the reaction path
import pylab as p
import numpy as np
import matplotlib.path as mpath
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
from scipy.interpolate import spline
import matplotlib.pyplot as plt
from numpy import array, linspace
from scipy.interpolate import spline
fig = p.figure(1)
sp = p.subplot(1,1,1)
p.plot(Epath, color='black', linestyle=':', linewidth=2.0, alpha=0.8)
p.text(0.37, 10.05, 'Free H$_2$O',fontsize=12, color='black',ha='right', va='bottom', alpha=1.0)
p.text(1.1, 238, 'H$_2$O + Pt',fontsize=12, color='black',ha='right', va='bottom', alpha=1.0)
p.title('H$_2$O disassociation')
p.ylabel('Energy [eV]')
p.xlabel('Reaction path')
#p.xlim([-0.5, 2.5])
#p.ylim([-0.5, 1.5])
sp.get_xaxis().set_ticks([]) # Turn off ticks on xaxis
#p.savefig('Teste.png')
p.show()

1 个答案:

答案 0 :(得分:3)

您只需执行以下操作即可绘制数据的常规三次样条曲线:

plot(np.linspace(0,3),spline([0,1,2,3],Epath,np.linspace(0,3)))

将产生如下内容:

enter image description here

但我怀疑这不是你想要的。您可能需要求助于Monotone splinesshape preserving splines之类的形状,以获得与Wikipedia链接中显示的曲线相同的形状。我不相信这些插值方法目前都在scipy中实现。

如果您对这些曲线的数学形式有一个大概的了解,您可以始终将自己的近似函数拟合到连续部分,并将该函数限制在该范围之外。例如:

plot(np.linspace(0,3),np.maximum(E_react,spline([0,1,2,3],Epath,np.linspace(0,3))))

会产生:

enter image description here

至少“看起来”像你链接的曲线,即使它不是正确的拟合。