如何使用matplotlib在单个页面上绘制多个图?


89

我编写的代码可以一次打开16位数字。目前,它们都以单独的图形打开。我希望他们在同一页面上全部打开。不一样的图。我希望在单个页面/窗口上有16个独立的图形。同样由于某种原因,numbins和defaultreallimits的格式也无法保存在图1之上。我是否需要使用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()

Answers:


15

要回答您的主要问题,您想使用subplot命令。我认为更改plt.figure(i)plt.subplot(4,4,i+1)应该可行。


199

来自las3rjock的答案(某种程度上是OP接受的答案)是错误的-代码无法运行,也不是有效的matplotlib语法;该答案没有提供可运行的代码,并且缺少任何信息或建议,认为OP可能在编写自己的代码以解决OP中的问题方面有用。

鉴于这是公认的答案,并且已经获得了几次赞成票,我认为应该进行一些解构。

首先,调用插曲没有给你多条曲线; 调用subplot可以创建一个图,也可以创建多个图。此外,“更改plt.figure(i)”不正确。

plt.figure()(其中plt或PLT通常是导入的matplotlib的pyplot库,并作为全局变量,plt或有时作为PLT反弹,如下所示:

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(其又,也可以在3元组的形式写为(2,1,1)指两行一列的波形图窗口;第三位数指定了相对于其它副区Windows的那个特定的副区窗口的顺序-在这种情况下,这是第一个绘图(将其放置在第1行上),因此是绘图编号1,第1行col 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行第1列(1),第1行第2列(2),第2行col 1(3),第2行col 2(4)。


1
add_subplot可以为少量子图使用单个整数参数,但是一旦需要9个以上的子图,则应使用其他答案中的版本,后者需要3个单独的整数参数。
user1244215 2013年

1
我可以fig.add_axes(rect)代替使用add_subplot吗?
奥尔科特

15
PLT?以前从未见过有人使用过
Darshan Chaudhary

3
您的第一段显然是虚假的,因为您可以通过运行进行验证,for i in range(16): plt.subplot(4, 4, i+1)并且不会出现语法错误。答案是可以接受的,因为它可能满足了OP的要求。
chthonicdaemon

3
这是一个很好的解决方案。但是,如果我想使用一个变量循环,该怎么办?
赵鹏举

83

由于这个问题是从4年前开始的,因此已经实现了新功能plt.subplots其中有一个非常方便新功能

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

这里axes是一个numpy.ndarrayAxesSubplot对象,使它很方便地通过不同的次要情节去只是使用数组索引[i,j]


对于仅需要使用matplotlib API的情况(由于显示不可用和其他有趣的事情),这是否也起作用?
eudoxos 2015年

2
@eudoxos是的,应该这样创建子图,以便在一页中打印多个图形,例如,而无需显示正在执行的操作
Saullo GP Castro

12

这也可以:

for i in range(19):
    plt.subplot(5,4,i+1) 

它在一页上绘制19个总图。格式为5下4横。


4

@doug&FS。的答案是非常好的解决方案。我想在pandas.dataframe上共享迭代解决方案。

import pandas as pd
df=pd.DataFrame([[1, 2], [3, 4], [4, 3], [2, 3]])
fig = plt.figure(figsize=(14,8))
for i in df.columns:
    ax=plt.subplot(2,1,i+1) 
    df[[i]].plot(ax=ax)
    print(i)
plt.show()

如果您的数据框已命名列,则需要使用for i,col in enumerate(df.columns):
drevicko
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.