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

ogq8wdun  于 2023-03-03  发布在  其他
关注(0)|答案(6)|浏览(169)

我编写了一段代码,可以一次打开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()
8wigbo56

8wigbo561#

来自 * las 3rjock * 的答案(OP接受的答案)是不正确的--代码不运行,也不是有效的matplotlib语法;该回答不提供可运行的代码,并且缺少OP在编写他们自己的代码以解决OP中的问题时可能发现有用的任何信息或建议。
考虑到这是公认的答案,而且已经获得了几张赞成票,我想一点解构是必要的。
首先,调用 subplot不会给予你多个情节;调用***子图***可以创建单个图,也可以创建多个图,另外“更改图(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()

这两个参数中的每一个都是在页面上正确放置相应绘图窗口的完整规范。

2,1,1(同样,其也可以写成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)。

mcdcgff0

mcdcgff02#

由于这个问题是4年前的问题,因此已经实现了一些新的东西,其中有一个新函数plt.subplots,非常方便:

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

其中axes是AxesSubplot对象的numpy.ndarray,这使得仅使用数组索引[i,j]就可以非常方便地遍历不同的子区。

9udxz4iz

9udxz4iz3#

为了回答你的主要问题,你想使用subplot命令,我想把plt.figure(i)改为plt.subplot(4,4,i+1)应该可以。

oyt4ldly

oyt4ldly4#

这也适用于:

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

它在一页上总共绘制了19个图形。格式是5个向下,4个横向。

yk9xbfzb

yk9xbfzb5#

@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()
q0qdq0h2

q0qdq0h26#

您可以使用add_subplot方法。例如,要创建2行3列的6个子区,您可以使用:

funcs = [np.cos, np.sin, np.tan, np.arctan]
x = np.linspace(0, 10, 100)

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

# iterate over the function list and add a subplot for each function
for num, func in enumerate(funcs, start=1):  
    ax = fig.add_subplot(2, 2, num) # plot with 2 rows and 2 columns
    ax.plot(x, func(x))
    ax.set_title(func.__name__)

# add spacing between subplots
fig.tight_layout()

结果:

相关问题