Python Matplotlib在附加轴上的错误位置打钩
我希望有一个上X轴,其刻度与原始X轴刻度(刻度标签可以不同)在相同的位置(在轴上)。这似乎很容易做到,但我不确定为什么下面的代码不起作用: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
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轴),但不能同时设置两个
或无
@RonOGaraax2。上面建议的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))