以下是我的建议,你可以尝试一下:
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()
生成的图像:
(原回答日期:2017年10月7日 4:20)
编辑1
由于这个答案比我预期的受欢迎,我发现需要进行一些小改变,以便能够灵活操纵各个子图的特征。因此,我向原始代码提供了这个新版本。
实质上,它提供了以下内容:
- 访问子图中各个轴的功能
- 在选择的轴/子图上绘制更多特征的可能性
新代码:
import numpy as np
import matplotlib.pyplot as plt
w = 10
h = 10
fig = plt.figure(figsize=(9, 13))
columns = 4
rows = 5
xs = np.linspace(0, 2*np.pi, 60)
ys = np.abs(np.sin(xs))
ax = []
for i in range(columns*rows):
img = np.random.randint(10, size=(h,w))
ax.append( fig.add_subplot(rows, columns, i+1) )
ax[-1].set_title("ax:"+str(i))
plt.imshow(img, alpha=0.25)
ax[2].plot(xs, 3*ys)
ax[19].plot(ys**2, xs)
plt.show()
生成的图表如下:
编辑2
在前面的例子中,代码使用单个索引访问子图非常不方便,特别是当图形具有多行/列子图时。以下提供了一种替代方法。下面的代码使用[row_index][column_index]
来访问子图,更适合操作包含多个子图的数组。
import matplotlib.pyplot as plt
import numpy as np
h, w = 10, 10
nrows, ncols = 5, 4
figsize = [6, 8]
xs = np.linspace(0, 2*np.pi, 60)
ys = np.abs(np.sin(xs))
fig, ax = plt.subplots(nrows=nrows, ncols=ncols, figsize=figsize)
for i, axi in enumerate(ax.flat):
img = np.random.randint(10, size=(h,w))
axi.imshow(img, alpha=0.25)
rowid = i // ncols
colid = i % ncols
axi.set_title("Row:"+str(rowid)+", Col:"+str(colid))
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()
结果图:
多子图的刻度和刻度标签
如果所有的子图共享相同的值范围,那么可以隐藏部分子图上的刻度和刻度标签以获得更清晰的图形。可以隐藏所有的刻度和刻度标签,除了左边和底部的外边缘,就像这个图一样。
要实现只显示左侧和底部边缘共享的刻度标签的图形,可以执行以下操作:
在 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代表要绘制的刻度线/刻度标签的数量。您可能需要其他适合您的图表的值。