与第一个相关的第二个matplotlib x轴:错误的刻度位置

时间:2016-08-17 14:08:08

标签: python matplotlib

我想在matplotlib图中添加第二个x轴,不是添加第二个图,而是添加链接到第一个轴的标签。这个question的答案在某种程度上无法解决第二轴边界的问题:

以下代码将第一个x轴的log10绘制为第二个轴:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure(3,figsize = [5,4])
ax1 = fig.add_subplot(111)
ax1.set_xlabel('first axis')
ax1.set_xlim([0, 120])
ax1.grid(True)

ax2 = ax1.twiny()
ax2.set_xlim(ax1.get_xlim())
# or alternatively :
# ax2.set_xbound(ax1.get_xbound())
second_ticks = np.array([1.,10.,100.])
ax2.set_xticks(second_ticks)
ax2.set_xticklabels(np.log10(second_ticks))
ax2.set_xlabel('second axis')

plt.show()

enter image description here

有效! 现在让我们按ax1.set_xlim([0, 120])

更改ax1.set_xlim([20, 120])

enter image description here

现在它失败了。我尝试ax2.set_xbound(ax1.get_xbound())没有任何区别。某种程度上ax2.set_xticks未能根据正确的x限制放置标记。

编辑:

我试图在ax1.set_xlim([20, 120])之后将ax2.set_xlim(ax1.get_xlim())放在任何地方,它再次给出错误的内容:

enter image description here

实际上我没有得到ax2.set_xticks()的含义,它设置了不显示ticklabels的位置?

编辑:

好的,我们得到了:x_lim定义ax2.set_xlim(ax1.get_xlim())必须在tick和ticklabel定义之后。

import numpy as np
import matplotlib.pyplot as plt

plt.close('all')

fig = plt.figure(1,figsize = [5,4])
ax1 = fig.add_subplot(111)
ax1.set_xlabel('first axis')
ax1.grid(True)
ax1.set_xlim([10, 120])

ax2 = ax1.twiny()

second_ticks = np.array([1.,10.,100.])
ax2.set_xticks(second_ticks)
ax2.set_xticklabels(np.log10(second_ticks))
ax2.set_xlabel('second axis')
ax2.set_xlim(ax1.get_xlim())

fig.tight_layout()

plt.show()

enter image description here

谢谢!

此致

1 个答案:

答案 0 :(得分:1)

我相信你会得到意想不到的结果,因为你强迫x-ticks和第二轴上的x-tick-labels是预定义的。无论你在第二轴上作为x-ticks放置什么,它们总是被标记为:ax2.set_xticklabels(np.log10(second_ticks))。相反,更新第二轴上的x-tick-labels >在第一轴上更新它们

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure(3,figsize = [5,4])
ax1 = fig.add_subplot(111)
ax1.set_xlabel('first axis')
x = np.linspace(0,100,num=200)
ax1.set_xlim([0, 120])
ax1.grid(True)

ax2 = ax1.twiny()
ax2.set_xlim(ax1.get_xlim())
# or alternatively :
# ax2.set_xbound(ax1.get_xbound())
# second_ticks = np.array([1.,10.,100.])
# ax2.set_xticks(second_ticks)
ax2.set_xlabel('second axis')

# Set the xlim on axis 1, then update the x-tick-labels on axis 2
ax1.set_xlim([20, 100])
ax2.set_xticklabels(np.log10(ax1.get_xticks()))
plt.show()

这可以解决您的问题吗? (请问。你的代码中有几个拼写错误......它不可运行......)