python - matplotlib 子图的怪异之处
问题描述
我正在按照本教程水平制作两个子图。根据示例,以下应该有效。
import matplotlib.pylab as plt
import numpy
# Sample data
x = numpy.linspace(0, 2 * numpy.pi, 400)
y1 = numpy.sin(x ** 2)
y2 = numpy.cos(x ** 2)
figure, axes = plt.subplots(1, 2)
axes[0, 0].plot(x, y)
axes[0, 1].plot(x, y)
不幸的是,我收到以下错误消息。
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-4-124cb6e8d977> in <module>
8
9 figure, axes = plt.subplots(1, 2)
---> 10 axes[0, 0].plot(x, y)
11 axes[0, 1].plot(x, y)
IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed
此外,如果我运行axes.shape
,我得到的输出为(2,)
. 我希望它是(1, 2)
。我错过了什么?
[请注意,前面是一个最小的工作示例,它在我的代码中作为一个特例出现。我不想通过(ax1, ax2)
前面示例中的路线,因为我不完全知道我想要提前多少个子图,所以我必须以编程方式执行此操作。
特别是,我有 $ n $ 功能,并且我想要形状 $ (ceil(n / 2), 2) $ 的子图。所以我会使用axes[i // 2, i % 2]
wherei
是我的迭代变量。但是当 $ n = 2 $ 时,我的代码就崩溃了。]
提前致谢!
[编辑:添加上下文以回答蒂姆的评论。]
解决方案
根据matplotlibplt.subplots
文档:
- 如果仅构造一个子图 (nrows=ncols=1),则生成的单个 Axes 对象作为标量返回。
- 对于 Nx1 或 1xM 子图,返回的对象是 Axes 对象的一维 numpy 对象数组。
- 对于 NxM,N>1 和 M>1 的子图作为二维数组返回。
这是默认行为,可以通过将squeeze
参数设置为False
(plt.subplots(1, 2, squeeze = False)
在您的情况下) 来更改它,在这种情况下,它将始终返回一个 2D 数组:
返回的 Axes 对象始终是包含 Axes 实例的二维数组,即使它最终是 1x1。
推荐阅读
- nhibernate - NHibernate删除多对多父子
- c++ - 将 Base 的实例向下转换为没有成员的派生类
- dart - Flutter Blue 示例无法通过扫描我的蓝牙 PC、其他 Android 手机和 iOS 进行查找
- python - 如何让我的登录功能在 Flask 中工作?
- python - 使用 praw permalink() 时出现“TypeError: 'str' object is not callable”
- android - 在片段选项卡式布局内的 RecyclerView 中滑动自定义功能
- laravel - 为什么我的 nginx 网络服务器不处理 ttf 字体?
- linux - 在 ubuntu 18.04 中使用终端安装 vscode .deb 包
- deep-learning - 经过一定数量的 epoch 后,深度 Q 学习代理的性能会下降
- javafx - 基于 ObservableList 的 TreeView 给出了不希望的结果