python-3.x - Matplotlib 如何用相同的轴规范做一个或多个子图
问题描述
我必须为几个机构制作图表,以展示他们对 1 个或多个接收者的表现。子图似乎是正确的方法,但似乎每个子图都要求我指定轴参数,即使它们是相同的。所以我创建了一小段代码来创建下标轴对象,除非只有一个接收器,否则它可以工作。
num_plots = len(receivers)
fig, axes = plt.subplots(num_plots, 1, figsize=(50, 150), squeeze=False)
minor_ticks = md.MinuteLocator(byminute=[0, 15, 30, 45], interval=1)
hours = md.HourLocator(interval=1)
for i,receiver in enumerate(receivers):
axes[i].xaxis.set_minor_locator(minor_ticks)
axes[i].xaxis.set_major_locator(hours)
axes[i].xaxis.set_major_formatter(md.DateFormatter('%H:%M'))
axes[i].xaxis.get_offset_text().set_fontsize(24)
axes[i].yaxis.get_offset_text().set_fontsize(24)
axes[i].grid(b=True, which='major', color='b', linestyle='-', alpha=0.6)
axes[i].grid(b=True, which='minor', color='r', linestyle='--', alpha=0.3)
axes[i].tick_params(axis="both", labelsize=30)
axes[i].set_ylabel('Bilateral Risk/5 min', fontsize=40, weight='bold')
axes[i].set_xlabel('Time', fontsize=40, weight='bold')
如果只有一个子图(基本上是 "fig, axes = plt.subplots(1, 1, fig size(50, 150), squeeze=False)" ),那么我会收到以下错误:
Traceback (most recent call last):
.
.
.
File "/Users/xxx/risk_scoring.py", line 276, in plot_result
axes[i].xaxis.set_minor_locator(minor_ticks)
AttributeError: 'numpy.ndarray' object has no attribute 'xaxis'
这是出乎意料的,因为我从这里和这里认为 'squeeze=' 将允许 1x1 子图。是什么造成了错误,或者有更好的方法来做到这一点?
跟进并回答:
取前面的代码并替换 receivers = ["a", "b", "c", "d"] 然后相同但只有一个接收器全部使用 'squeeze=True' (默认值):
0
1
2
3
[<matplotlib.axes._subplots.AxesSubplot object at 0x7f865c94b610>
<matplotlib.axes._subplots.AxesSubplot object at 0x7f865b6f3750>
<matplotlib.axes._subplots.AxesSubplot object at 0x7f865b727410>
<matplotlib.axes._subplots.AxesSubplot object at 0x7f865bd67790>]
和
Traceback (most recent call last):
File "main.py", line 186, in <module>
axes[i].xaxis.set_minor_locator(minor_ticks)
TypeError: 'AxesSubplot' object is not subscriptable
原因是第一种情况下的“轴”是一个数组,但在第二种情况下,它只是一个对象“AxesSubplot(0.125,0.11;0.775x0.77)”。
如果您执行第二种情况(1 个接收器)但设置 'squeeze=false' 您会得到:
[[<matplotlib.axes._subplots.AxesSubplot object at 0x7f2e447a7790>]]
0
Traceback (most recent call last):
File "main.py", line 186, in <module>
axes[i].xaxis.set_minor_locator(minor_ticks)
AttributeError: 'numpy.ndarray' object has no attribute 'xaxis'
那是一个二维数组。所以我用二维索引更改了所有对“轴”的引用,例如“axes[i][0].set...”,这一切似乎都有效。
解决方案
推荐阅读
- c++ - std::map::upper_bound 与 std::upper_bound 性能
- android - 使用多部分时改造内部服务器错误
- c++ - 如何在 CLion 中运行 MySQL/C++ 连接器
- gcc - 如何使用 gcc 生成 MIPS 语法的汇编代码?
- javascript - jQuery ajax 完全循环
- c# - c#使用对象方法而不转换它
- django - Django 找不到我的静态文件目录
- updates - 在 Fedora 30 上运行“dnf update”时出现 libnfsidmap 文件冲突
- java - 如何使用 JPA 或 JDBC 使用 REF_CURSOR 调用 PL/SQL 函数
- php - 从计费运输中删除 p 和 span 包装器并形成 woocommerce