Как правильно отображать несколько изображений на одной фигуре?
Я пытаюсь отобразить 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. Как я могу это достичь?
Ответы
Ответ 1
Вот мой подход, который вы можете попробовать:
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]()
(Дата первоначального ответа: 7 октября 17 года в 4:20)
Edit1
Так как этот ответ популярен за пределами моего ожидания. И я вижу, что небольшое изменение необходимо для обеспечения гибкости при манипулировании отдельными участками. Так что я предлагаю эту новую версию оригинальному коду. По сути, это обеспечивает: -
- доступ к отдельным осям участков
- Возможность нанесения большего количества объектов на выбранные оси
Новый код:
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(x, 3*y)
ax[19].plot(y**2, x)
plt.show() # finally, render the plot
Получившийся сюжет:
![enter image description here]()
Ответ 2
Вы можете попробовать следующее:
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()
Однако это в основном просто копирование и вставка отсюда: несколько цифр в одном окне, по этой причине этот пост следует рассматривать как дубликат.
Надеюсь, это поможет.