绘制弹性网格时,在matplotlib中删除/隐藏空子图

问题描述

我正在使用nilearn通过大脑的3D图像文件沿轴绘制一系列切割。我的目标是创建一个灵活的功能,在其中可以随意更改切割的行数,列数和坐标范围。这样做的原因是,我可以生成一个.png文件并将其用于可视化,例如直接在纸上。

因此,基本上,我使用嵌套循环来生成matplotlib子图的网格,并用脑图像填充它们。这些来自nilearn函数的一行代码,所以这不是问题。

我的问题是:有没有办法检测和隐藏/删除空子图? 问题在于,现在空子图带有一条错误消息,似乎与返回的.png文件混淆了。空子图也显示在.png文件中,情况并非如此。

这是我的代码

i = -55
j = 55
rows = 5
cols = 5
k = np.ceil((abs(i)+j)/(rows*cols))
cuts = np.arange(i,j,k)
rsn_img = 'rsn_img.png'

fig,axes = plt.subplots(rows,cols,figsize=(15,10))

for r in range(rows):
    for c in range(cols):
        display=plotting.plot_stat_map(rsn_four,display_mode='x',axes=axes[r,c],cut_coords=[cuts[r*cols+c]],threshold=2)
        
        print(f'plotting at index [ {r},{c}]')
    display.savefig(rsn_img)

这是输出

enter image description here

我应该将未填充的子图删除。 感谢您的提前帮助!

解决方法

我假设您知道要绘制的图像N的数量。

这就是我的写法:

i = -55
j = 55
cols = 5
rows = 5
k = np.ceil((abs(i)+j)/(rows*cols))
cuts = np.arange(i,j,k)
N = len(cuts)

fig,axs = plt.subplots(rows,cols)
for ax,cut in zip(axs.flat,cuts):
    display=plotting.plot_stat_map(rsn_four,display_mode='x',axes=ax,cut_coords=cut,threshold=2)
# remove unused axes
for ax in axs.flat[N:]:
    ax.remove()