如何使用matplotlib在一页上绘制多个图形?

97 投票
6 回答
289491 浏览
提问于 2025-04-15 13:59

我写了一段代码,可以一次打开16个图形。目前,它们都是作为独立的图表打开的。我希望它们能在同一页面上打开。不是同一个图表,而是希望在一个页面/窗口上有16个独立的图表。此外,出于某种原因,numbins和defaultreallimits的格式在第一个图形之后就不再保持了。我需要使用subplot命令吗?我不明白为什么我需要这样做,但又想不出其他办法。

import csv
import scipy.stats
import numpy
import matplotlib.pyplot as plt

for i in range(16):
    plt.figure(i)
    filename= easygui.fileopenbox(msg='Pdf distance 90m contour', title='select file', filetypes=['*.csv'], default='X:\\herring_schools\\')
    alt_file=open(filename)    
    a=[]
    for row in csv.DictReader(alt_file):
        a.append(row['Dist_90m(nmi)'])
    y= numpy.array(a, float)    
    relpdf=scipy.stats.relfreq(y, numbins=7, defaultreallimits=(-10,60))
    bins = numpy.arange(-10,60,10)
    print numpy.sum(relpdf[0])
    print bins
    patches=plt.bar(bins,relpdf[0], width=10, facecolor='black')
    titlename= easygui.enterbox(msg='write graph title', title='', default='', strip=True, image=None, root=None)
    plt.title(titlename)
    plt.ylabel('Probability Density Function')
    plt.xlabel('Distance from 90m Contour Line(nm)')
    plt.ylim([0,1])

plt.show()

相关问题:

6 个回答

84

这个问题是四年前的,现在已经有了很多新东西。其中有一个新函数plt.subplots,非常方便

fig, axes = plot.subplots(nrows=2, ncols=3, sharex=True, sharey=True)

在这里,axes是一个numpy.ndarray类型的对象,里面包含了多个AxesSubplot对象。这样一来,我们只需要用数组的索引[i,j]就能很方便地访问不同的子图。

203

来自las3rjock的回答,虽然被提问者接受了,但其实是错误的——代码无法运行,也不是有效的matplotlib语法;这个回答没有提供可以运行的代码,也没有给出任何对提问者有帮助的信息或建议,帮助他们自己写代码来解决问题。

既然这是被接受的答案,并且已经获得了几个赞,我觉得有必要对它进行一些拆解。

首先,调用subplot意味着你会得到多个图;subplot是用来创建单个图的,也可以用来创建多个图。此外,“改变plt.figure(i)”这个说法也是不正确的。

plt.figure()(其中plt或PLT通常是matplotlib的pyplot库,被导入并作为全局变量重新绑定,像这样:

from matplotlib import pyplot as PLT

fig = PLT.figure()

上面这一行创建了一个matplotlib图形实例;这个对象的add_subplot方法会被调用来为每个绘图窗口创建(非正式地想象一下,一个x轴和y轴组成一个单独的子图)。你可以这样创建(无论是一个还是多个在一页上):

fig.add_subplot(111)

这个语法等同于

fig.add_subplot(1,1,1)

选择一个对你来说有意义的。

下面我列出了在一页上绘制两个图的代码,一个在另一个上面。格式是通过传递给add_subplot的参数来完成的。注意第一个图的参数是(211),第二个图的参数是(212)。

from matplotlib import pyplot as PLT

fig = PLT.figure()

ax1 = fig.add_subplot(211)
ax1.plot([(1, 2), (3, 4)], [(4, 3), (2, 3)])

ax2 = fig.add_subplot(212)
ax2.plot([(7, 2), (5, 3)], [(1, 6), (9, 5)])

PLT.show()

这两个参数都是完整的规范,用于正确放置各自的图窗口在页面上。

211(同样,也可以用三元组的形式写作(2,1,1))意味着两行一列的图窗口;第三个数字指定了这个特定子图窗口相对于其他子图窗口的顺序——在这种情况下,这是第一个图(所以它放在第一行),因此是图1,行1,列1。

第二次调用add_subplot时传递的参数,与第一次的唯一不同就是最后的数字(是2而不是1,因为这个图是第二个图,行2,列1)。

如果你想在一页上放四个图,以2x2的矩阵配置,你需要调用add_subplot方法四次,传入这四个参数(221),(222),(223),和(224),分别在10点、2点、8点和4点的位置创建四个图,按照这个顺序。

注意这四个参数的前两个数字都是2——这表示2 x 2的配置,也就是两行两列。

每个参数中的第三个(最右边的)数字编码了该特定图窗口在2 x 2矩阵中的顺序——也就是说,第一行第一列(1),第一行第二列(2),第二行第一列(3),第二行第二列(4)。

17

要回答你的主要问题,你需要使用 subplot 这个命令。我觉得把 plt.figure(i) 改成 plt.subplot(4,4,i+1) 应该就可以了。

撰写回答