了解 matplotlib.subplots python [duplicate]

understanding matplotlib.subplots python [duplicate]

提问人:CJD 提问时间:6/17/2017 更新时间:6/17/2017 访问量:12205

问:

我在一些帮助下构建了一组饼图 将图像插入饼图切片 我的图表看起来很棒,现在我需要将它们全部放在一个 2x3 的图形中,在共享的 x 和 y 轴上带有常见的刻度线。 首先,我正在查看子情节,并认为我可以让它工作。我下载了一些示例,并开始尝试一些东西。

    f, (a) = (plt.subplots(nrows=1, ncols=1, sharex=True, sharey=True))#,
                 #squeeze=False, subplot_kw=None, gridspec_kw=None))
    print(type(f),'\n',type(a),'\n')#,type(b))

收益 率:

类 'matplotlib.figure.Figure'

班级 'matplotlib.axes._subplots.轴子图'

而:

    f, (a) = (plt.subplots(nrows=1, ncols=1, sharex=True, sharey=True, squeeze=False, subplot_kw=None, gridspec_kw=None))
    print(type(f),'\n',type(a),'\n')#,type(b))

返回:

类 'matplotlib.figure.Figure'

类 'numpy.ndarray'

当我这样做时:

f, (a,b) = (plt.subplots(nrows=2, ncols=1, sharex=True, sharey=True, squeeze=False, subplot_kw=None, gridspec_kw=None))
    print(type(f),'\n',type(a),'\n',type(b))

我得到了类似的结果,但是如果 nrows=1 和 ncols=2 我会收到错误:

    f, (a,b) = (plt.subplots(nrows=1, ncols=2, sharex=True, sharey=True, squeeze=False, subplot_kw=None, gridspec_kw=None))
    print(type(f),'\n',type(a),'\n',type(b))

ValueError:没有足够的值来解包(预期为 2,得到 1)

但同样是:

    f, (a , b) = (
    plt.subplots(nrows=1, ncols=2, sharex=True, sharey=True))#,
                 #squeeze=False, subplot_kw=None, gridspec_kw=None))
    print(type(f),'\n',type(a),'\n',type(b))

给 类 'matplotlib.figure.Figure'

班级 'matplotlib.axes._subplots.轴子图'

班级 'matplotlib.axes._subplots.轴子图'

为什么它是数组或轴,为什么 2X1 工作而 1X2 不工作? 我希望我能更好地理解文档。谢谢。

python numpy matplotlib

评论


答:

24赞 ImportanceOfBeingErnest 6/17/2017 #1

不同的返回类型是由于 plt.subplots() 的关键字参数,默认情况下设置为。 让我们通过各自的解包来增强文档:squeezeTrue

squeeze : bool, 可选, default: True

  • 如果为 True,则从返回的 Axes 对象中挤出额外的维度:

    • 如果只构造一个子图 (nrows=ncols=1),则生成的单个 Axes 对象将作为标量返回。
      fig, ax = plt.subplots()
    • 对于 Nx1 或 1xN 子图,返回的对象是 Axes 对象作为 numpy 1D 数组返回的 1D numpy 对象数组。
      (用于 Nx1) (用于 1xN)
      fig, (ax1, ..., axN) = plt.subplots(nrows=N, ncols=1)fig, (ax1, ..., axN) = plt.subplots(nrows=1, ncols=N)
    • 对于 NxM,具有 N>1 和 M>1 的子图作为 2D 数组返回。
      fig, ((ax11, .., ax1M),..,(axN1, .., axNM)) = plt.subplots(nrows=N, ncols=M)
  • 如果为 False,则根本不执行任何压缩:返回的 Axes 对象始终是包含 Axes 实例的 2D 数组,即使它最终为 1x1。

    用于 Nx1
    用于 1xN
    fig, ((ax,),) = plt.subplots(nrows=1, ncols=1, squeeze=False)fig, ((ax,), .. ,(axN,)) = plt.subplots(nrows=N, ncols=1, squeeze=False)fig, ((ax, .. ,axN),) = plt.subplots(nrows=1, ncols=N, squeeze=False)
    fig, ((ax11, .., ax1M),..,(axN1, .., axNM)) = plt.subplots(nrows=N, ncols=M)

或者,您可以始终使用解压缩的版本

fig, ax_arr = plt.subplots(nrows=N, ncols=M, squeeze=False)

并索引数组以获取轴 。ax_arr[1,2].plot(..)

因此,对于 2 x 3 网格,是否设置为 实际上并不重要。结果将始终是 2D 数组。您可以将其解压缩为squeezeFalse

fig, ((ax1, ax2, ax3),(ax4, ax5, ax6)) = plt.subplots(nrows=2, ncols=3)

作为 matplotlib 轴对象,或者您可以使用打包版本ax{i}

fig, ax_arr = plt.subplots(nrows=2, ncols=3)
ax_arr[0,0].plot(..) # plot to first top left axes
ax_arr[1,2].plot(..) # plot to last bottom right axes