【问题标题】:How to make several plots on a single page using matplotlib?如何使用 matplotlib 在单个页面上制作多个图?
【发布时间】:2010-11-24 10:39:51
【问题描述】:

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

【问题讨论】:

    标签: python matplotlib


    【解决方案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()
    

    结果:

    【讨论】:

      【解决方案2】:

      因为这个问题是从 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] 浏览不同的子图非常方便。

      【讨论】:

      • 这是否也适用于我只需要使用 matplotlib API 的情况(由于显示不可用和其他有趣的事情)?
      • @eudoxos 是的,应该这样,您可以创建这样的子图,以便在一页中打印多个图形,例如,无需显示正在执行的操作
      【解决方案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()
      

      【讨论】:

      • 如果你的数据框有命名列,你需要使用类似for i,col in enumerate(df.columns):
      【解决方案4】:

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

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

      首先,调用 subplot 确实 not 会给你多个情节; 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) 表示 两行 并且一列绘图窗口;第三个数字指定特定子绘图窗口相对于其他子绘图窗口的顺序——在这种情况下,这是第一个绘图(将其放置在第 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)。

      【讨论】:

      • 我可以用fig.add_axes(rect)代替add_subplot吗?
      • PLT ?以前从未见过它被使用过
      • 您在此处的第一段显然是不真实的,因为您可以通过运行for i in range(16): plt.subplot(4, 4, i+1) 进行验证并且没有观察到语法错误。答案被接受,因为它可能做了 OP 想要的。
      • 这是一个不错的解决方案。但是如果我想用一个变量循环,怎么办?
      【解决方案5】:

      这也有效:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-03
          • 1970-01-01
          相关资源
          最近更新 更多