gpt4 book ai didi

python-3.x - 如何将 gridspec 与 plt.subplots() 结合起来以消除子图行之间的空间

转载 作者:行者123 更新时间:2023-12-01 11:21:20 25 4
gpt4 key购买 nike

我正在尝试在子图中绘制多个图像,并消除子图(水平和垂直)之间的空间或控制它。我尝试使用 How to Use GridSpec... 中的建议.我也在这里试过,但他们没有使用 subplots(): space between subplots我可以通过下面的代码消除水平空间,但不能消除垂直空间。请不要标记为重复,因为我已经尝试过其他帖子,但它们没有按照我的意愿进行。我的代码如下所示。也许在 gridspec_kw 字典中我需要另一个关键字参数?我想为此使用 plt.subplots() 而不是 plt.subplot() 。万一重要,图像不是方形的,而是矩形的。我还尝试在 plt.show() 之前添加 f.tight_layout(h_pad=0,w_pad=0) 但它没有改变任何东西。

def plot_image_array_with_angles(img_array,correct_angles,predict_angles,
fontsize=10,figsize=(8,8)):
'''
Imports:
import matplotlib.gridspec as gridspec
import numpy as np
import matplotlib.pyplot as plt
'''
num_images = len(img_array)
grid = int(np.sqrt(num_images)) # will only show all images if square
#f, axarr = plt.subplots(grid,grid,figsize=figsize)
f, axarr = plt.subplots(grid,grid,figsize=figsize,
gridspec_kw={'wspace':0,'hspace':0})
im = 0
for row in range(grid):
for col in range(grid):
axarr[row,col].imshow(img_array[im])
title = 'cor = ' + str(correct_angles[im]) + ' pred = ' + str(predict_angles[im])
axarr[row,col].set_title(title,fontsize=fontsize)
axarr[row,col].axis('off') # turns off all ticks
#axarr[row,col].set_aspect('equal')
im += 1
plt.show()
return

最佳答案

imshow 图的纵横比会自动设置,使图像中的像素呈正方形。此设置比任何 subplots_adjustgridspec 间距设置都强。或者换句话说,如果子图的纵横比设置为 "equal",则您无法直接控制子图之间的间距。

第一个显而易见的解决方案是将图像纵横比设置为自动 ax.set_aspect("auto")。这解决了子图间距的问题,但扭曲了图像。

另一种选择是调整图形边距和图形大小,使子图之间的间距符合需要。

假设 fighfigw 是以英寸为单位的图形高度和宽度,而 s 是以英寸为单位的子图宽度。边距是 bottomtopleftright(相对于图形大小)和间距 hspace 在垂直方向和 wspace 在水平方向(相对于子图大小)。行数用 n 表示,列数用 m 表示。 aspect 是子图(图像)高度和宽度之间的比率(aspect = 图像高度/图像宽度)。

然后尺寸可以通过

设置
fig, axes = plt.subplots(nrows=n, ncols=m, figsize=(figwidth, figheight))
plt.subplots_adjust(top=top, bottom=bottom, left=left, right=right,
wspace=wspace, hspace=hspace)

各自的值可以根据:

enter image description here

或者,如果边距相同:

enter image description here

一个例子:

import matplotlib.pyplot as plt

image = plt.imread("/image/9qe6z.png")
aspect = image.shape[0]/float(image.shape[1])
print aspect
n = 2 # number of rows
m = 4 # numberof columns
bottom = 0.1; left=0.05
top=1.-bottom; right = 1.-left
fisasp = (1-bottom-(1-top))/float( 1-left-(1-right) )
#widthspace, relative to subplot size
wspace=0.15 # set to zero for no spacing
hspace=wspace/float(aspect)
#fix the figure height
figheight= 3 # inch
figwidth = (m + (m-1)*wspace)/float((n+(n-1)*hspace)*aspect)*figheight*fisasp

fig, axes = plt.subplots(nrows=n, ncols=m, figsize=(figwidth, figheight))
plt.subplots_adjust(top=top, bottom=bottom, left=left, right=right,
wspace=wspace, hspace=hspace)

for ax in axes.flatten():
ax.imshow(image)
ax.set_title("title",fontsize=10)
ax.axis('off')

plt.show()

enter image description here

关于python-3.x - 如何将 gridspec 与 plt.subplots() 结合起来以消除子图行之间的空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42475508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com