Python:循环内的子图:第一个面板出现在错误的位置

Posted

技术标签:

【中文标题】Python:循环内的子图:第一个面板出现在错误的位置【英文标题】:Python: subplot within a loop: first panel appears in wrong position 【发布时间】:2013-06-17 03:11:42 【问题描述】:

我对 Python 还很陌生,并且从更多的 Matlab 角度来看。 我正在尝试制作一系列 2 x 5 面板轮廓子图。到目前为止我的方法 一直将我的 Matlab 代码(在一定程度上)转换为 Python,并在循环中绘制我的子图。代码的相关部分如下所示:

fig=plt.figure(figsize=(15, 6),facecolor='w', edgecolor='k')
for i in range(10):

    #this part is just arranging the data for contourf 
    ind2 = py.find(zz==i+1)
    sfr_mass_mat = np.reshape(sfr_mass[ind2],(pixmax_x,pixmax_y))
    sfr_mass_sub = sfr_mass[ind2]
    zi = griddata(massloclist, sfrloclist, sfr_mass_sub,xi,yi,interp='nn')


    temp = 250+i  # this is to index the position of the subplot
    ax=plt.subplot(temp)
    ax.contourf(xi,yi,zi,5,cmap=plt.cm.Oranges)
    plt.subplots_adjust(hspace = .5,wspace=.001)

    #just annotating where each contour plot is being placed
    ax.set_title(str(temp))

作为这个论坛的新手,我似乎不允许附加生成的图像。但是,通过我在代码中的索引作为“临时”,2 x 5 面板的结果布局是:

251 - 252 - 253 - 254 - 255
256 - 257 - 258 - 259 - 250

然而,我想要的是

250 - 251 - 252 - 253 - 254
255 - 256 - 257 - 258 - 259 

也就是说,第一个面板 (250) 出现在我认为 259 应该在的最后一个位置。 251 似乎是我想要放置 250 的地方。它们似乎都在正确的顺序中,只是循环移动了一个。

我知道这会很愚蠢,但感谢您提供的任何帮助。

提前谢谢你。

【问题讨论】:

【参考方案1】:

将您的代码与一些随机数据一起使用,这将起作用:

fig, axs = plt.subplots(2,5, figsize=(15, 6), facecolor='w', edgecolor='k')
fig.subplots_adjust(hspace = .5, wspace=.001)

axs = axs.ravel()

for i in range(10):

    axs[i].contourf(np.random.rand(10,10),5,cmap=plt.cm.Oranges)
    axs[i].set_title(str(250+i))

布局有点乱,但这是因为您当前的设置(figsize、wspace 等)。

【讨论】:

感谢您的快速回复!您的更改效果很好,并稍微简化了我的代码 :) 非常感谢!! 嗨! @Rutger Kassies,我如何隐藏图中的 y 轴,只让第一个? @Jennifer Barreta,将 'sharey=True' 关键字添加到 'plt.subplots'。 axs = axs.ravel() 是这里的美女! 我找这个代码 sn-p 太久了。谢谢!【参考方案2】:

问题是索引subplot 正在使用。子图从 1 开始计数! 因此您的代码需要阅读

fig=plt.figure(figsize=(15, 6),facecolor='w', edgecolor='k')
for i in range(10):

    #this part is just arranging the data for contourf 
    ind2 = py.find(zz==i+1)
    sfr_mass_mat = np.reshape(sfr_mass[ind2],(pixmax_x,pixmax_y))
    sfr_mass_sub = sfr_mass[ind2]
    zi = griddata(massloclist, sfrloclist, sfr_mass_sub,xi,yi,interp='nn')


    temp = 251+i  # this is to index the position of the subplot
    ax=plt.subplot(temp)
    ax.contourf(xi,yi,zi,5,cmap=plt.cm.Oranges)
    plt.subplots_adjust(hspace = .5,wspace=.001)

    #just annotating where each contour plot is being placed
    ax.set_title(str(temp))

注意计算temp的行的变化

【讨论】:

也感谢 David 的快速回复...我确实按照您的建议进行了更改,但是,尽管所有面板都以正确的顺序显示,但最终面板窗口变得更窄并被压扁了一些原因。 @russelljohnston,你添加了colorbar 命令吗?这总是会从最后一组轴中窃取空间 HI Esmit,不,我没有添加颜色条命令。由于我的时间很短,Rutger 提供的修复意味着我没有用我原来的方法探索潜在的问题。谢谢。【参考方案3】:

与Rutger Kassies 提供的解决方案基本相同,但使用更 Pythonic 的语法:

fig, axs = plt.subplots(2,5, figsize=(15, 6), facecolor='w', edgecolor='k')
fig.subplots_adjust(hspace = .5, wspace=.001)

data = np.arange(250, 260)

for ax, d in zip(axs.ravel(), data):
    ax.contourf(np.random.rand(10,10), 5, cmap=plt.cm.Oranges)
    ax.set_title(str(d))

【讨论】:

以上是关于Python:循环内的子图:第一个面板出现在错误的位置的主要内容,如果未能解决你的问题,请参考以下文章

Python中两个图的子图未正确显示

python 循环绘制子图时,设置共享xy轴

Matplotlib空白图(应该有子图)

Matplotlib的子图subplot的使用

python中不均匀的子图

Matplotlib 不同大小的子图