如何正确显示一个图形中的多个图像?

我试图在一个图形上显示20个随机图像。图像确实显示了,但是它们被覆盖了。我使用:

import numpy as np
import matplotlib.pyplot as plt
w=10
h=10
fig=plt.figure()
for i in range(1,20):
img = np.random.randint(10, size=(h,w))
fig.add_subplot(i,2,1)
plt.imshow(img)
plt.show()

我希望他们自然地出现在一个网格布局(说4x5) ,每个大小相同。问题的一部分在于我不知道 add _ subplot 的参数是什么意思。文档指出,参数是行数、列数和绘图数。没有定位论点。此外,地块号码只能是1或2。我怎么才能做到呢?

295848 次浏览

你可以试试以下方法:

import matplotlib.pyplot as plt
import numpy as np


def plot_figures(figures, nrows = 1, ncols=1):
"""Plot a dictionary of figures.


Parameters
----------
figures : <title, figure> dictionary
ncols : number of columns of subplots wanted in the display
nrows : number of rows of subplots wanted in the figure
"""


fig, axeslist = plt.subplots(ncols=ncols, nrows=nrows)
for ind,title in zip(range(len(figures)), figures):
axeslist.ravel()[ind].imshow(figures[title], cmap=plt.jet())
axeslist.ravel()[ind].set_title(title)
axeslist.ravel()[ind].set_axis_off()
plt.tight_layout() # optional






# generation of a dictionary of (title, images)
number_of_im = 20
w=10
h=10
figures = {'im'+str(i): np.random.randint(10, size=(h,w)) for i in range(number_of_im)}


# plot of the images in a figure, with 5 rows and 4 columns
plot_figures(figures, 5, 4)


plt.show()

然而,这基本上只是复制和粘贴从这里: 一个窗口中的多个图形的原因,这篇文章应该被视为一个复制。

希望这个能帮上忙。

下面是我的方法,你可以试试:

import numpy as np
import matplotlib.pyplot as plt


w = 10
h = 10
fig = plt.figure(figsize=(8, 8))
columns = 4
rows = 5
for i in range(1, columns*rows +1):
img = np.random.randint(10, size=(h,w))
fig.add_subplot(rows, columns, i)
plt.imshow(img)
plt.show()

由此产生的图像:

output_image

(原答案日期: 10月7日17日4:20)

编辑1

因为这个答案出乎我的意料。我认为需要一个小小的改变,以便能够灵活地操纵个别情节。因此,我提供这个新版本的原始代码。 实质上,它提供了:-

  1. 获取次要地段的单个轴线
  2. 在选定的轴/子图上绘制更多特征的可能性

新代码:

import numpy as np
import matplotlib.pyplot as plt


w = 10
h = 10
fig = plt.figure(figsize=(9, 13))
columns = 4
rows = 5


# prep (x,y) for extra plotting
xs = np.linspace(0, 2*np.pi, 60)  # from 0 to 2pi
ys = np.abs(np.sin(xs))           # absolute of sine


# ax enables access to manipulate each of subplots
ax = []


for i in range(columns*rows):
img = np.random.randint(10, size=(h,w))
# create subplot and append to ax
ax.append( fig.add_subplot(rows, columns, i+1) )
ax[-1].set_title("ax:"+str(i))  # set title
plt.imshow(img, alpha=0.25)


# do extra plots on selected axes/subplots
# note: index starts with 0
ax[2].plot(xs, 3*ys)
ax[19].plot(ys**2, xs)


plt.show()  # finally, render the plot

由此产生的阴谋:

enter image description here

编辑2

在前面的示例中,代码提供了对具有单个索引的子图的访问,当图中有许多行/列的子图时,这是不方便的。这里有一个替代方案。下面的代码提供了对 [row_index][column_index]子图的访问,它更适合于操作许多子图的数组。

import matplotlib.pyplot as plt
import numpy as np


# settings
h, w = 10, 10        # for raster image
nrows, ncols = 5, 4  # array of sub-plots
figsize = [6, 8]     # figure size, inches


# prep (x,y) for extra plotting on selected sub-plots
xs = np.linspace(0, 2*np.pi, 60)  # from 0 to 2pi
ys = np.abs(np.sin(xs))           # absolute of sine


# create figure (fig), and array of axes (ax)
fig, ax = plt.subplots(nrows=nrows, ncols=ncols, figsize=figsize)


# plot simple raster image on each sub-plot
for i, axi in enumerate(ax.flat):
# i runs from 0 to (nrows*ncols-1)
# axi is equivalent with ax[rowid][colid]
img = np.random.randint(10, size=(h,w))
axi.imshow(img, alpha=0.25)
# get indices of row/column
rowid = i // ncols
colid = i % ncols
# write row/col indices as axes' title for identification
axi.set_title("Row:"+str(rowid)+", Col:"+str(colid))


# one can access the axes by ax[row_id][col_id]
# do additional plotting on ax[row_id][col_id] of your choice
ax[0][2].plot(xs, 3*ys, color='red', linewidth=3)
ax[4][3].plot(ys**2, xs, color='green', linewidth=3)


plt.tight_layout(True)
plt.show()

由此产生的阴谋:

plot3

子情节数组的刻度和刻度标签

如果所有的子情节具有相同的值范围,那么可以隐藏子情节中的一些刻度和刻度标签,以获得更清晰的情节。所有的刻度和刻度标签都可以隐藏起来,除了左边和底部的边缘。

share_ticklabels

要实现只在左边和底部边缘共享刻度标签的情节,您可以执行以下操作:-

fig, ax = plt.subplots()中添加选项 sharex=True, sharey=True

这行代码将变成:

fig,ax=plt.subplots(nrows=nrows,ncols=ncols,figsize=figsize,sharex=True,sharey=True)

要指定所需的刻度数和要绘制的标签,

for i, axi in enumerate(ax.flat):的主体内部,添加这些代码

axi.xaxis.set_major_locator(plt.MaxNLocator(5))
axi.yaxis.set_major_locator(plt.MaxNLocator(4))

数字5和4是要绘制的剔/剔 _ 标签的数量。你可能需要其他适合你情节的价值观。