首页 > 解决方案 > 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...”,这一切似乎都有效。

标签: python-3.xmatplotlibsubplot

解决方案


推荐阅读