【问题标题】:Lines splines in graphic of values but y值图形中的线样条,但 y
【发布时间】:2023-03-07 18:01:01
【问题描述】:

我想生成如下链接的图表

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()

【问题讨论】:

  • Gnuplot 适合这个问题,还是不适合?
  • 遗憾的是我想用 matplotlib 使用样条线生成折线图。如果没有正确指定,我很抱歉

标签: python linux numpy matplotlib


【解决方案1】:

您可以通过执行以下操作来绘制数据的常规三次样条版本:

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

这将产生类似:

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

如果您对这些曲线的数学形式有一个粗略的了解,您总是可以为连续部分拟合自己的近似函数,并将函数钳制在该范围之外。例如:

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

会产生:

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

【讨论】:

  • 第二个数字已更正。这就是我想做的,谢谢你帮助朋友
猜你喜欢
  • 2021-05-12
  • 2022-11-28
  • 2017-09-19
  • 2018-09-07
  • 2019-07-23
  • 1970-01-01
  • 2022-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多