我想在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()
有效!
现在让我们按ax1.set_xlim([0, 120])
ax1.set_xlim([20, 120])
现在它失败了。我尝试ax2.set_xbound(ax1.get_xbound())
没有任何区别。某种程度上ax2.set_xticks
未能根据正确的x限制放置标记。
编辑:
我试图在ax1.set_xlim([20, 120])
之后将ax2.set_xlim(ax1.get_xlim())
放在任何地方,它再次给出错误的内容:
实际上我没有得到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()
谢谢!
此致
答案 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()
这可以解决您的问题吗? (请问。你的代码中有几个拼写错误......它不可运行......)