Python Matplotlib:生成多个具有不同比例和反转比例的双轴

Python Matplotlib:生成多个具有不同比例和反转比例的双轴,python,matplotlib,scaling,axes,Python,Matplotlib,Scaling,Axes,我想在两个x轴和y轴上绘制一个数据系列,以便有4个不同的轴。 首先是x(能量单位为eV)与y(归一化计数)轴,然后是x(与能量成反比的波长)与y(计数)轴。 我的代码是: import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab from scipy.constants import h, c, e def E(wavelength): return (h*c)/(waveleng

我想在两个x轴和y轴上绘制一个数据系列,以便有4个不同的轴。 首先是x(能量单位为eV)与y(归一化计数)轴,然后是x(与能量成反比的波长)与y(计数)轴。 我的代码是:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
from scipy.constants import h, c, e


def E(wavelength):
   return (h*c)/(wavelength*e)

wavelen = np.linspace(800e-9,1600e-9,200)
E_eV = E(wavelen)
loc, scale = 950e-9, 3.0
counts = mlab.normpdf(wavelen,950e-9,100e-9)/100
counts_norm = counts/10000


fig, ax  = plt.subplots()

ax1 = ax
ax2 = ax.twinx()
ax3 = ax.twiny()

plt.ticklabel_format(style='sci', scilimits=(0,0))

ax1.plot(E_eV, counts_norm)
ax1.set_xlim(E(1600e-9),E(800e-9))
ax1.set_ylabel('normalized counts')
ax1.set_xlabel('energy (eV)')
ax2.plot(E_eV, counts)
ax2.set_xlim(E(1600e-9),E(800e-9))
ax2.set_ylabel('counts')
ax3.plot(wavelen*1e9, counts_norm)
ax3.set_xlim(1600,800)
ax3.set_xlabel('wavelength (nm)')
ax3.ticklabel_format(style='plain')


plt.tight_layout()
plt.show()

正如您所看到的,这些曲线的缩放方式不正确,因此它们在x方向重叠并具有相同的尺寸。
您能帮助我如何为顶部的x(波长)轴设置正确的参数吗?

我建议只在主轴上打印,然后同步双轴的标签。我编辑了您的示例,以展示如何在静态绘图中实现这一点

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
from scipy.constants import h, c, e

def E(wavelength):
    return (h*c)/(wavelength*e)
def getWaveLength(energy):
    return (h*c)/(energy*e)
def getCounts(normcounts):
    return normcounts*1000

wavelen = np.linspace(800e-9,1600e-9,200)
E_eV = E(wavelen)
loc, scale = 950e-9, 3.0
counts = mlab.normpdf(wavelen,950e-9,100e-9)/100
counts_norm = counts/10000

fig, ax1  = plt.subplots()

ax2 = ax1.twinx()
ax3 = ax1.twiny()

plt.ticklabel_format(style='sci', scilimits=(0,0))

ax1.plot(E_eV, counts_norm)
ax1.set_xlim(E(1600e-9),E(800e-9))
ax1.set_ylabel('normalized counts')
ax1.set_xlabel('energy (eV)')
ax2.set_ylabel('counts')
ax3.set_xlabel('wavelength (nm)')
ax3.ticklabel_format(style='plain')

# get the primary axis x tick locations in plot units
xtickloc = ax1.get_xticks() 
# set the second axis ticks to the same locations
ax3.set_xticks(xtickloc)
# calculate new values for the second axis tick labels, format them, and set them
x2labels = ['{:.3g}'.format(x) for x in getWaveLength(xtickloc)]
ax3.set_xticklabels(x2labels)
# force the bounds to be the same
ax3.set_xlim(ax1.get_xlim()) 

#same for y
ytickloc = ax1.get_yticks()
ax2.set_yticks(ytickloc)
ax2.set_yticklabels([str(int(y)) for y in getCounts(ytickloc)])
ax2.set_ylim(ax1.get_ylim())

plt.tight_layout()
plt.show()

静态axis可以是一个解决方案,但实际上我希望格式化程序能够自动计算滴答声。我已经在我的应用程序中以交互方式计算了滴答声,方法是将示例中的方法捆绑到一个函数中,并定期使用。