2009-08-31 5 views
73

私は一度に16の図を開くコードを書いています。現在、それらはすべて別々のグラフとして開きます。同じページにすべてを開くようにしたいと思います。同じグラフではありません。私は1つのページ/ウィンドウに16の別々のグラフが必要です。また、何らかの理由で、数値とデフォルトの値の形式が過去のFigure 1には反映されません。subplotコマンドを使用する必要がありますか?なぜ私はしなければならないのか分からないが、他に何をするのか分からない。matplotlibを使用して1ページにいくつかのプロットを作成するには?

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の問題を解決するために独自のコードを書く際に役立つと思われる情報や提案が欠けています。

これは受け入れられた回答であり、既にいくつかの議決権を得ていることを考えれば、私は少し解体していると思います。

最初に、サブプロットを呼び出します。には複数のプロットがあります。 subplotは、1つのプロットを作成し、複数のプロットを作成するために呼び出されます。さらに、 "plt.figure(i)の変更"は正しくありません。ただ

from matplotlib import pyplot as PLT 

fig = PLT.figure() 

ライン:

plt.figure()(ここでPLTまたはPLTは通常、輸入matplotlibののpyplotライブラリあるので、同様に、グローバル変数、PLTまたは時々PLTとしてリバウンド上記の例ではmatplotlib Figureインスタンスが作成され、このオブジェクトのadd_subplotメソッドがすべてのプロットウィンドウ(1つのサブプロットからなるx軸&のy軸と非公式に考える)に対して呼び出されます。 so

fig.add_subplot(111) 

この構文はあなたに理にかなっているものを選ぶ

fig.add_subplot(1,1,1) 

に相当します。

以下、ページ上に2つのプロットをプロットするコードを示します。書式設定は、add_subplotに渡された引数で行われます。引数が最初のプロットでは()、2番目のプロットでは()です。

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つの引数のそれぞれは、それぞれのプロットウィンドウをページ上に正しく配置するための完全な仕様です。再び、また、(2,1,1)のように3組の形で書くことができる

は(二列プロットウィンドウのつの列を意味し、3桁目は、順序を指定しますその特定のサブプロットウィンドウの他のサブプロットウィンドウに対する相対的な位置を示します。この場合、これは最初のプロット(1行目に配置されます)であり、プロット番号1、1列目1です。

引数は2番目add_subplotへのコールは、最初の数字と末尾の数字だけが異なります(1ではなく2がこのプロットは2番目のプロット(2行1列目)です。より多くのプロットと

例:代わりに、ページ上プロットを望んでいた場合は、2×2のマトリクス状に、あなたは、これらの4つの引数(221)、(222)に渡し、add_subplot方法を4回呼び出します、 (223)および(224)を使用して、それぞれ10,2,8および4時にページ上に4つのプロットをこの順序で作成する。

4つの引数のそれぞれには、2 x 2構成、つまり2行2列をエンコードする2つの誘導2が含まれています。

4つの引数のそれぞれの3番目の数字(右端)は、2 x 2マトリックスの特定のプロットウィンドウの順序をエンコードします。つまり、行1 col 1(1)、行1 col 2(2) )、行2 col 1(3)、行2 col 2(4)。

+0

私はこの質問に感謝しています。私は5x5マトリックスレイアウトで25のサブプロットをプロットする必要があります。私はこのエラーが表示されます:__ValueError:subplotの引数は3桁の長さでなければならない__ – nkint

+0

@nkintあなたはそれを行う方法を見つけましたか? – pms

+1

add_subplotは、小さな数のサブプロットに対して1つの整数引数を取ることができますが、9つ以上のサブプロットが必要になると、3つの整数引数を取る他の回答からバージョンを使用する必要があります。 – user1244215

9

また、これは動作します:

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

これは、1つのページ上の19枚の合計のグラフをプロットします。フォーマットは、新しいものが実装されている前にこの質問は4年からなので...

67

ダウン5と全体で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はい、何かが行われていることを示す必要なく、たとえば、1ページに複数のグラフィックスを印刷するために、このようなサブプロットを作成することができます –

+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

関連する問題