首页 > 解决方案 > Jupyter Notebook中的Python Matplotlib get_xticklabels - 为什么它在与绘图代码相同的单元格中返回一个空白列表?

问题描述

问题总结: 我正在开发一个 Jupyter notebook 作为使用新包的模板。对于数据可视化,我试图用日期字符串和实验名称作为 x 轴刻度标签进行绘图。有时,这些图会导致 x 轴拥挤。我正在尝试编写一个函数,允许用户根据输入步长每隔一个标签(和刻度线)、第三个标签等。简单的函数如下所示:

def run_number_labels(axes, label_list, stepsize):
    '''
    This function changes a plot to plot on run numbers. The stepsize determines 
    how many labels to display, use larger numbers for more concentrated data sets
    (1 is every 1, 2 is every 2, and 5 is every 5 labels, for instance). Care should
    be taken to ensure that the length of the label_list is the same as the amount
    of x-axis ticks. This can be verified by running print(axes.get_xticks()) in 
    your notebook. 
    '''
    axes.set_xticks(axes.get_xticks()[::stepsize])
    b = axes.set_xticklabels(labels=label_list[::stepsize], rotation=55, ha='right')

这在大多数情况下都有效,但是我注意到 Jupyter 笔记本中的一个错误(?)阻碍了我的测试。

到目前为止,我不能简单地获取 x 轴刻度标签并在单元格中打印它们!

我试过的: 我提供下面的测试代码:

x = np.linspace(0,10*math.pi,50)
print(x.shape)
y1 = []
y2 = []
for ind, val in enumerate(x):
    y1.append(math.sin(val))
    y2.append(math.cos(val+math.pi))

print(np.array(y1).shape)
fig, ax = plt.subplots(nrows=2, ncols=1, sharex=True)
ax[0].plot(x, np.array(y1), linestyle='-', color='lightgreen')
ax[1].plot(x, np.array(y2), linestyle='-', color='rosybrown')

#Now get the list of xlables
label_list = ax[1].get_xticklabels()
print(label_list)

这会在 matplotlib 子图数组中生成一个简单的图,并具有共享的 x 轴。它尝试label_list从 x 轴的第二个或底部开始命名标签字符串列表。情节有效,但未生成列表: 具有两行一列的子图,共享 x 轴,范围为 0-30,步长为 5。

返回的 x 轴标签列表如下: [Text(0, 0, ''), Text(0, 0, ''), Text(0, 0, ''), Text(0, 0, ''), Text(0, 0, ''), Text(0, 0, ''), Text(0, 0, ''), Text(0, 0, ''), Text(0, 0, '')]

换句话说,它是空白的。

如果我在下一个单元格中使用相同的代码行生成列表,我会得到: [Text(-5.0, 0, '−5'), Text(0.0, 0, '5'), Text(5.0, 0, '15'), Text(10.0, 0, '25'), Text(15.0, 0, '35'), Text(20.0, 0, ''), Text(25.0, 0, ''), Text(30.0, 0, ''), Text(35.0, 0, '')]

但是,在下一个单元格中,我似乎无法使用相同的轴来可视化图表。我读过 plt.draw() 函数应该在 Jupyter 笔记本中启用此容量,但是由于未指定的渲染器,此命令返回错误。

是否有任何解决方法可以让我在 Jupyter 笔记本的同一单元格中查看 x 轴标签列表?

编辑 政变的答案,建议plt.show()在请求轴标签列表之前使用它来获取列表。但是,我无法操作轴(例如,使用上面的 run_number_labels 函数并将标签列表传递给它)。有没有办法在 plt.show() 之后重新操作轴?如果没有,我将需要一种不同于政变答案的方式来解决这个问题。

谢谢你。

标签: pythonmatplotlibjupyter-notebook

解决方案


在定义 label_list 之前添加 plt.show() 有效。

在此处输入图像描述

x = np.linspace(0,10*math.pi,50)

y1 = []
y2 = []
for ind, val in enumerate(x):
    y1.append(math.sin(val))
    y2.append(math.cos(val+math.pi))

fig, ax = plt.subplots(nrows=2, ncols=1, sharex=True)
ax[0].plot(x, np.array(y1), linestyle='-', color='lightgreen')
ax[1].plot(x, np.array(y2), linestyle='-', color='rosybrown')

plt.show()

#Now get the list of xlables
label_list = ax[1].xaxis.get_majorticklabels()
print(label_list)

推荐阅读