python - 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 轴标签列表如下:
[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() 之后重新操作轴?如果没有,我将需要一种不同于政变答案的方式来解决这个问题。
谢谢你。
解决方案
在定义 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)
推荐阅读
- php - 关于 Last_insert_id 一致性的困惑
- r - 如何使用ggplot调整x轴上的时间?
- python - 如何将for循环的每次迭代的结果存储在数据框中
- c# - LINQ 不同并更改结果类型
- python - Pandas 在索引上合并,但列移动了 1
- xamarin.forms - 我可以在 GestureRecognize 上删除和添加命令吗?
- css - Bootstrap 4中连续8列
- url - 如何编辑 .mp4 文件的 URL 以使其在浏览器中流式传输?
- java - 从 Spring 3.1.9 迁移到 Spring 4.2.4 时,@Autowired 不起作用。但适用于 Spring 3 和 Java7
- matplotlib - 并排定义单个子图的大小