了解matplotlib.subplots python

CJD*_*CJD 6 python plot numpy matplotlib

我已经构建了一组饼图,其中有一些帮助将图像插入饼图切片 我的图表看起来很精彩,现在我需要将它们中的所有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))
Run Code Online (Sandbox Code Playgroud)

收益率:

class'matplotlib.figure.Figure'

class'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))
Run Code Online (Sandbox Code Playgroud)

收益:

class'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))
Run Code Online (Sandbox Code Playgroud)

我得到了类似的结果,但是如果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))
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

给出'matplotlib.figure.Figure'类

class'matplotlib.axes._subplots.AxesSubplot'

class'matplotlib.axes._subplots.AxesSubplot'

为什么它或阵列或轴,以及为什么2X1工作和1X2不工作?我希望天堂高,我可以更好地理解文档.谢谢.

Imp*_*est 15

不同的返回类型是由默认情况下设置为的squeeze关键字参数引起的.让我们通过相应的拆包来增强文档:plt.subplots()True

squeeze:bool,optional,默认值:True

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

    • 如果只构造了一个子图(nrows = ncols = 1),则生成的单个Axes对象将作为标量返回.
      fig, ax = plt.subplots()
    • 对于Nx1或1xN子图,返回的对象是Axes对象的1D numpy对象数组,作为numpy 1D数组返回.
      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的子图作为2D数组返回.
      fig, ((ax11, .., ax1M),..,(axN1, .., axNM)) = plt.subplots(nrows=N, ncols=M)
  • 如果为False,则根本不进行压缩:返回的Axes对象始终是包含Axes实例的2D数组,即使它最终为1x1.对于1xN的
    fig, ((ax,),) = plt.subplots(nrows=1, ncols=1, squeeze=False)
    fig, ((ax,), .. ,(axN,)) = plt.subplots(nrows=N, ncols=1, squeeze=False)Nx1
    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)
Run Code Online (Sandbox Code Playgroud)

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

因此,对于2 x 3网格,如果设置squeeze为,则实际上并不重要False.结果将始终是2D数组.你可以打开包装

fig, ((ax1, ax2, ax3),(ax4, ax5, ax6)) = plt.subplots(nrows=2, ncols=3)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)