使用set_xticklabels基于同一图的其他子图设置第二个x轴给出Text(X,u' X')表示

时间:2017-01-13 13:41:32

标签: python matplotlib

我试图使用同一图中另一个子图中的xticklabels设置第二个x轴:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec


gs = gridspec.GridSpec(1,2)
ax1 = plt.subplot(gs[0])
ax2 = plt.subplot(gs[1])
ax1.plot([1,2,3,4,5],[1,2,3,4,5])
ax2.plot([4,5,6,7,8],[1,2,3,4,5])
ax3 = ax2.twiny()
ax3.set_xticklabels(ax1.get_xticklabels())
plt.show()

然后,得到的图给出了matplotlib.text对象的文本表示:

xticklabel representation

任何想法在这里出了什么问题? 谢谢!

2 个答案:

答案 0 :(得分:0)

get_xticklabels返回Text个对象的列表,但set_xticklabels需要一个字符串列表。正如您所写的那样,您只需获取Text对象的文本表示,而不是标签本身的文本。在调用Text之前,您需要从set_xticklabels对象列表中提取标签列表

现在,如何获取字符串列表取决于ax1上的xtick标签是自动分配的刻度标签还是自定义字符串。如果您使用自动标签,那么您需要获取轴的Formatter并将刻度转换为字符串以传递给set_xticklabels

# Get the formatter which determines the way that they are displayed
formatter = ax1.get_xaxis().get_major_formatter()

# Convert each xtick to it's string representation using the formatter
labels = [formatter.format_data(x) for x in ax1.get_xticks()]

# Update the labels on your other axes
ax3.set_xticklabels(labels)

如果它们已经是自定义字符串,那么您可以执行以下操作:

ax3.set_xticklabels([t.get_text() for t in ax1.get_xticklabels()])

您也可以自己指定格式

ax3.set_xticklabels(['%d' % x for x in ax1.get_xticks()])

答案 1 :(得分:0)

根据此ticklabel交换的目的,复制ticks本身而不是ticklabel可能就足够了。

ax3.set_xticks( ax1.get_xticks() )

如果同时复制轴限制

,这可能特别合适
ax3.set_xlim( ax1.get_xlim() )