96

我编写了一次打开 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()
4

6 回答 6

202

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

鉴于这是已被接受的答案并且已经收到了几张赞成票,我想应该进行一些解构。

首先,调用subplot不会你多个情节;调用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(同样,也可以写成三元组形式,因为 (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)。

于 2010-01-13T20:52:22.557 回答
83

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

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

其中axesanumpy.ndarray是 AxesSubplot 对象,因此仅使用数组索引就可以非常方便地浏览不同的子图[i,j]

于 2013-09-07T12:14:45.670 回答
17

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

于 2009-08-31T19:19:17.110 回答
12

这也有效:

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

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

于 2010-01-14T14:51:37.823 回答
3

@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()
于 2017-07-21T05:12:02.393 回答
1

例如,要创建 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()

结果:

在此处输入图像描述

于 2021-06-09T13:38:00.910 回答