Python Matplotlib在附加轴上的错误位置打钩

Python Matplotlib在附加轴上的错误位置打钩,python,matplotlib,customization,Python,Matplotlib,Customization,我希望有一个上X轴,其刻度与原始X轴刻度(刻度标签可以不同)在相同的位置(在轴上)。这似乎很容易做到,但我不确定为什么下面的代码不起作用: import numpy as np import matplotlib.pyplot as plt fig = plt.figure() ax1 = fig.add_subplot(111) X = np.linspace(11,80,1000) Y = 2*np.sin(X)*np.exp(-X/20.) ax1.plot(X,Y) ax2 = a

我希望有一个上X轴,其刻度与原始X轴刻度(刻度标签可以不同)在相同的位置(在轴上)。这似乎很容易做到,但我不确定为什么下面的代码不起作用:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(111)

X = np.linspace(11,80,1000)
Y = 2*np.sin(X)*np.exp(-X/20.)

ax1.plot(X,Y)
ax2 = ax1.twiny()

old_ticks = ax1.get_xticks()
ax2.set_xticks(old_ticks)

plt.show()
输出如下所示:很明显,上轴上的记号与下轴上的记号不在同一位置(即,上轴上有7个记号,而下轴上只有6个记号)

为什么会这样

编辑:设置xlim(如下所示)仅适用于初始打印,但在不同区域放大时不起作用。我添加了一个回调函数,在放大/缩小时,将“
ax2
上的记号添加到与“
ax1
上的记号相同的位置,但这似乎不起作用

另外,我之所以使用
twiny
是因为
ax2
显示的勾号值最终将以非线性方式取决于
ax1
勾号值。我只希望刻度在轴上的相同位置。 将numpy作为np导入 将matplotlib.pyplot作为plt导入

fig = plt.figure()
ax1 = fig.add_subplot(111)

X = np.linspace(11,80,1000)
Y = 2*np.sin(X)*np.exp(-X/20.)

ax1.plot(X,Y)
ax2 = ax1.twiny()

ax2.set_xlim(ax1.get_xlim())
ax2.set_xticks(ax1.get_xticks())

def on_xlim_changed(ax1):
    ax2.set_xlim(ax1.get_xlim())
    ax2.set_xticks(ax1.get_xticks())

ax1.callbacks.connect('xlim_changed',on_xlim_changed)

plt.show()
尝试:

此外,如果只需要在顶部显示记号,则不需要双轴,只需执行此操作即可

ax1.xaxis.set_ticks_position('both')

您应该使用
定位器
功能

import matplotlib.ticker as mticks

N = 5
ax1.get_xaxis().set_major_locator(mticks.LinearLocator(numticks=N))
ax2.get_xaxis().set_major_locator(mticks.LinearLocator(numticks=hN))
()这将在轴上放置间隔均匀的记号

然后,
格式化程序
s将负责格式化标签


请注意,这可能会倾向于外观非常奇怪的标签。位置跳跃的原因是默认定位符
AutoLocator
,尝试将记号放在“好”的位置(整数,甚至倍数等),这样你就不会得到看起来像“1.52547841082”的记号标签。

这里的诀窍是使用
ax2禁用次轴上的缩放。set\u导航(False)
。仅当缩放不影响轴本身的限制时,调整回调中的限制才有效:

将numpy导入为np
将matplotlib.pyplot作为plt导入
图=plt.图()
ax1=图add_子批次(111)
x=np.linspace(11,80,1000)
y=2*np.sin(x)*np.exp(-x/20)
ax1.绘图(x,y)
ax2=ax1.twny()
ax2.设置_导航(错误)#重要!
old_ticks=ax1.get_xticks()
ax2.设置刻度(旧刻度)
添加了ax1.grid(linewidth=1,ls='--')#以更好地查看(错误)对齐。
ax2.set_xlim(ax1.get_xlim())
_xlim_上的def已更改(ax_):
ax2.set_xticks(ax.get_xticks())
ax2.set_xlim(ax_xlim.get_xlim())
ax1.callbacks.connect('xlim\u已更改',on\u xlim\u已更改)
plt.show()
不使用
set\u导航(False)

用答案中的代码缩放

这似乎仅在最初显示绘图时有效,但在放大绘图上的不同区域时无效。我想使用twiny的原因是因为我想让记号位于相同的位置(与底轴相同),但记号标签会不同。我编辑了上面的问题,加入了“放大”clarification@behzad.nouri由于某些原因,
设置勾号位置(“两者”)
不适用于matplotlib
'3.1.3'
。可以将它们设置在
顶部
底部
,用于Y轴),但不能同时设置
两个
@RonOGara
ax2。上面建议的setxlim(ax1.getxlim(),只需说六年过去了,在网上仍然没有一个简单的答案。在您的第二个示例代码中,如果您交换这两行,您将得到一个不错的初始图形,但实际上,缩放将导致刻度不对齐:
ax2.set\u xlim(ax1.get\u xlim())ax2.set\u xticks(ax1.get\u xticks())
一些可能有用的帖子(也在我的赏金描述中):stackoverflow.com/a/35904761/2542091 stackoverflow.com/a/27344398/2542091这很简单,嗯?;)好极了谢谢!
import matplotlib.ticker as mticks

N = 5
ax1.get_xaxis().set_major_locator(mticks.LinearLocator(numticks=N))
ax2.get_xaxis().set_major_locator(mticks.LinearLocator(numticks=hN))