使用Matplotlib绘制大量子图

14

我想使用Python的matplotlib创建100个子图的绘图。我找不到适当的语法:

我想要类似这样的东西(这是不起作用的)

plt.subplot(10,10,i,X1, Y) 

在一个循环中,i从0到99,然后

plt.show()

对于只有几个子图的情况,很多教程都提供了语法。此时,语法可以

plt.close('all')
fig = plt.figure()

ax1 = plt.subplot(221)
ax2 = plt.subplot(223)
ax3 = plt.subplot(122)

example_plot(ax1)
example_plot(ax2)
example_plot(ax3)

plt.tight_layout()

这里是代码来源。

对于我的问题,我猜我不能使用相同的语法,因为我会有plt.subplot(10101)等,这我不理解。

你有解决方案吗?

谢谢。

5个回答

16

试一下这个:

fig, ax = plt.subplots(10, 10)

ax将会包含一个由列表(嵌套列表)组成的100个轴。

它是一个非常方便的函数,来自于文档

Definition: plt.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, **fig_kw)
Create a figure with a set of subplots already made.

This utility wrapper makes it convenient to create common layouts of
subplots, including the enclosing figure object, in a single call.

13
这里有一个完全有效的代码解决方案,显示了如何编号,因为看起来人们仍然会来这里查看:
columns = 10
rows = 4
fig, ax_array = plt.subplots(rows, columns,squeeze=False)
for i,ax_row in enumerate(ax_array):
    for j,axes in enumerate(ax_row):
        axes.set_title('{},{}'.format(i,j))
        axes.set_yticklabels([])
        axes.set_xticklabels([])
#         axes.plot(you_data_goes_here,'r-')
plt.show()

以下代码可以演示数字编号的工作原理(我只使用了4行而不是10行来缩小图片大小,只需将“rows”更改为10即可获得10行子图):

Matplotlib array of subplots

编号显示了每个位置的 i 和 j 值,以便您可以在 matplotlib 子图数组中按照所需的方式对齐物体。这可以实现任何布局的子图。


2
我知道这很古老,但如果将行或列设为1,则代码会失败,因为没有可迭代的内容。 - Mr. Fegur
@Mr.Fegur - 这是个非常公正的观点,尽管整个重点在于展示一个大数组。希望人们能够看到如何消除不必要的循环,如果他们想要的话,你需要一个例子吗? - Ezekiel Kruglick
1
也许在plt.subplots中加入squeeze='False'选项可以使答案处理列/行=1的情况。 - Mr. Fegur
@Mr.Fegur - 已添加。我以前从未有机会使用过它,谢谢你指出来。很棒! - Ezekiel Kruglick
请参考以下链接,了解如何为所有子图设置一个颜色刻度:https://dev59.com/VmYr5IYBdhLWcg3wTYgQ - user3440489

10

你的例子几乎正确。请使用:

for i in range(100):
    ax = plt.subplot(10,10,i)
    ax.plot(...)

4
如果您想生成大约100个子图,实际上您可能需要像这样做,这将运行得更快。您放弃了拥有单独的轴标签,但是对于100个子图而言,除非您打算制作巨大的打印输出,否则您也无法阅读标签。

1

以下是一个工作示例,您可以选择要生成的行数列数。在该示例中,我以随机颜色生成随机正弦波。

import numpy             as np
import matplotlib.pyplot as plt

cols = 5
rows = 20

x_data  = np.linspace(0,50,100)

fig, ax = plt.subplots(rows, cols, figsize=(40, 40), dpi=80)
for i in range(cols*rows):
    ax = plt.subplot(rows,cols,i+1)    
    ax.plot(x_data, random.uniform(0, 5)*np.sin(x_data+random.uniform(0, 2*np.pi)), 
            c= [random.uniform(0, 1),random.uniform(0, 1),random.uniform(0, 1)])

Image of the generated plot


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接