2009-08-31 49 views
73

我写了一次打开16位数字的代码。目前它们都以单独的图形形式打开。我希望他们在同一页面上打开所有内容。不一样的图。我想要在单个页面/窗口上显示16个单独的图形。另外由于某种原因,numbins和defaultreallimits的格式不会保留在图1中。我是否需要使用子图命令?我不明白为什么我不得不但不知道我会做什么?如何使用matplotlib在单个页面上制作几张图?

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

回答

11

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

+1

请看下面的正确答案。这不起作用。 – Shanemeister

162

las3rjock的回答,这在某种程度上是OP接受的答案,不正确 - 代码不运行,也不是有效的matplotlib语法;该答案不提供任何可运行的代码,并且缺少OP可能在编写自己的代码以解决OP中的问题时有用的任何信息或建议。

鉴于这是公认的答案,并且已经收到了好几张赞成票,我想有点解构。

首先,打电话子区确实不是给你多个地块; 子图块被调用来创建单个图,以及创建多个图。另外,“改变plt.figure(i)”是不正确的。

plt.figure()(其中PLT或PLT通常matplotlib的pyplot库进口和反弹为全局变量,PLT或有时PLT,像这样:

from matplotlib import pyplot as PLT 

fig = PLT.figure() 

线刚上面创建一个matplotlib图形实例;然后为每个绘图窗口调用该对象的add_subplot方法(非正式地考虑包含单个子图的x轴)。创建(无论是在页面上只有一个还是几个),就像所以

fig.add_subplot(111) 

此语法相当于

fig.add_subplot(1,1,1) 

选择一个对你有意义。

下面我列出了在一个页面上绘制两个图的代码。格式化是通过传递给add_subplot的参数完成的。注意第一个曲线的参数是(),第二个曲线是()。

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

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

(其再次,也可以在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行col 1(1),第1行col 2(2 ),第2行col 1(3),第2行col 2(4)。

+0

我很欣赏这个问题,因为它很清楚而且具有说服力。但我需要在5x5矩阵布局中绘制25个子图。我得到这个错误:__ValueError:对子图的参数必须是一个3位长的___ – nkint

+0

@nkint你知道如何去做吗? – pms

+1

add_subplot可以为少量的子图展示一个整数参数,但是一旦你需要多于9个子图,你应该使用其他答案中的版本,它需要3个独立的整数参数。 – user1244215

9

这工作也:

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

它绘制在一个页面上19个总图。格式为5下来,4跨..

67

由于这个问题是来自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]来浏览不同的子图非常方便。

+0

这样做是否也适用于我只需要使用matplotlib API的情况(由于显示不可用以及其他有趣的事情)? – eudoxos

+2

@eudoxos是的,它应该,你可以创建这样的subplots,以便在一个页面上打印多个图形,例如,无需显示正在执行的操作 –

+0

为什么downvote? –

1

@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() 
+0

如果你的数据框有命名的列,你需要使用类似'for i,col in enumerate(df.columns):' – drevicko

相关问题