如何使用matplotlib在单个页面上制作几个图?

时间:2009-08-31 19:17:03

标签: python matplotlib

我编写的代码可以同时打开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()

6 个答案:

答案 0 :(得分:184)

las3rjock 的答案,不知何故是OP接受的答案,是不正确的 - 代码不运行,也不是matplotlib语法有效;该答案不提供可运行的代码,并且没有任何信息或建议,OP可能会发现在编写自己的代码以解决OP中的问题时非常有用。

鉴于这是已接受的答案并且已经收到了几个上票,我想有点解构。

首先,调用子剧情 会给你多个情节;调用 子图 来创建单个图,以及创建多个图。另外,“改变plt.figure(i)”是不正确的。

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

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)表示两行一列的绘图窗口;第三个数字指定该特定子绘图窗口相对于其他子绘图窗口的顺序 - 在这种情况下,这是第一个绘图(将其放置在第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行第1列(1),第1行第2列(2) ,第2行第1栏(3),第2栏第2栏(4)。

答案 1 :(得分:76)

由于这个问题来自4年前,新的事情已经实施,其中有一个new function plt.subplots which is very convenient

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

其中axes是AxesSubplot对象的numpy.ndarray,使得使用数组索引[i,j]来浏览不同的子图非常方便。

答案 2 :(得分:15)

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

答案 3 :(得分:10)

这也有效:

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

它在一页上绘制了19个总图。格式是5向下和4跨..

答案 4 :(得分:2)

@doug&amp; 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()

答案 5 :(得分:0)

例如要创建 6 个 2 行 3 列的子图,您可以使用:

fig = plt.figure(figsize=(10, 5))

for idx in range(1, 7):
    ax = fig.add_subplot(2, 3, idx)
    ax.plot([1, 2, 3], [10, 20, 30])
    ax.set_title(f'idx={idx}')

# add spacing between subplots
fig.tight_layout()

结果:

enter image description here