【问题标题】:understanding matplotlib.subplots python [duplicate]了解matplotlib.subplots python [重复]
【发布时间】:2017-11-19 18:56:59
【问题描述】:

我在Insert image into pie chart slice的帮助下构建了一组饼图 我的图表看起来很棒,现在我需要将所有 6 个图表放在一个 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.AxesSubplot'

同时:

    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.AxesSubplot'

类'matplotlib.axes._subplots.AxesSubplot'

为什么它是数组或轴,以及为什么 2X1 有效而 1X2 无效? 我希望我能更好地理解文档。谢谢。

【问题讨论】:

    标签: python numpy matplotlib plot


    【解决方案1】:

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

    squeeze : bool,可选,默认:True

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

      • 如果只构建一个子图 (nrows=ncols=1),则生成的单个 Axes 对象将作为标量返回。
        fig, ax = plt.subplots()
      • 对于 Nx1 或 1xN 子图,返回的对象是一维 numpy 对象数组,Axes 对象作为 numpy 一维数组返回。
        fig, (ax1, ..., axN) = plt.subplots(nrows=N, ncols=1)(对于 Nx1)
        fig, (ax1, ..., axN) = plt.subplots(nrows=1, ncols=N)(对于 1xN)李>
      • 对于 NxM,N>1 和 M>1 的子图将作为二维数组返回。
        fig, ((ax11, .., ax1M),..,(axN1, .., axNM)) = plt.subplots(nrows=N, ncols=M)
    • 如果为 False,则根本不进行任何压缩:返回的 Axes 对象始终是包含 Axes 实例的二维数组,即使它最终是 1x1。
      fig, ((ax,),) = plt.subplots(nrows=1, ncols=1, squeeze=False)
      fig, ((ax,), .. ,(axN,)) = plt.subplots(nrows=N, ncols=1, squeeze=False) for Nx1
      fig, ((ax, .. ,axN),) = plt.subplots(nrows=1, ncols=N, squeeze=False) 1xN
      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 网格,将 squeeze 设置为 False 实际上并不重要。结果将始终是二维数组。你可以解压成

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

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      相关资源
      最近更新 更多