Zak*_*irn 2 matplotlib python-3.x
我试图在子图中绘制多个图像,并消除子图中的空间(水平和垂直)或控制它。我尝试使用“ 如何使用GridSpec ...”中的建议。我在这里也尝试过,但是他们没有使用subplots():在
我的代码中,我能够消除水平空间,但不能消除水平空间,而不能消除垂直空间。请不要将其标记为重复项,因为我已经尝试了其他帖子,而他们没有按照我的意愿去做。我的代码如下所示。也许在gridspec_kw词典中需要另一个关键字参数?我想为此使用plt.subplots()而不是plt.subplot()。万一重要,图像不是正方形,而是矩形。我也尝试f.tight_layout(h_pad=0,w_pad=0)
在plt.show()之前添加,但是它没有改变任何内容。
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
Run Code Online (Sandbox Code Playgroud)
imshow图的纵横比会自动设置为使图像中的像素平方。此设置比的subplots_adjust
或gridspec
设置要强。换句话说,如果子图的纵横比设置为,则无法直接控制子图之间的间距"equal"
。
第一个明显的解决方案是将图像宽高比设置为自动ax.set_aspect("auto")
。这解决了子图间距的问题,但是使图像失真。
另一种选择是调整图形边距和图形大小,以使子图之间的间距符合要求。
假设figh
和figw
是图形高度和宽度(以英寸为单位)以及s
子图的宽度(以英寸为单位)。边缘是bottom
,top
,left
和right
(相对于图中的尺寸)和间距hspace
在垂直和wspace
水平方向(相对于副区的大小)。表示行n
数和列数m
。的aspect
是副区(图像)的高度和宽度之间的比(aspect = image height / image width
)。
然后可以通过设置尺寸
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)
Run Code Online (Sandbox Code Playgroud)
可以根据以下公式计算相应的值:
或者,如果边距相同:
一个例子:
import matplotlib.pyplot as plt
image = plt.imread("https://i.stack.imgur.com/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()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1156 次 |
最近记录: |