matplotlibを使用して1つのページに複数のプロットを作成するにはどうすればよいですか?


89

一度に16桁開くコードを書いています。現在、それらはすべて個別のグラフとして開きます。それらをすべて同じページで開いてほしい。同じグラフではありません。1つのページ/ウィンドウに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()

回答:


15

主な質問に答えるには、subplotコマンドを使用します。に変更するplt.figure(i)ことplt.subplot(4,4,i+1)でうまくいくと思います。


199

las3rjockからの答えは、OPによって受け入れられた答えですが、正しくありません。コードは実行されず、有効なmatplotlib構文でもありません。その答えは実行可能なコードを提供しておらず、OPの問題を解決するために独自のコードを記述する際にOPが役立つと思われる情報や提案が欠けています。

それが受け入れられた回答であり、すでにいくつかの賛成票を受け取っていることを考えると、少し分解することが適切だと思います。

まず、subplotを呼び出しても複数のプロット得られませsubplotは、単一のプロットを作成するため、および複数のプロットを作成するために呼び出されます。また、「plt.figure(i)の変更」は正しくありません。

plt.figure()(ここで、pltまたはPLTは、通常、次のようにインポートされ、グローバル変数pltまたは時々PLTとしてインポートおよび再バインドされるmatplotlibのpyplotライブラリです。

from matplotlib import pyplot as PLT

fig = PLT.figure()

上の行は、matplotlibのFigureインスタンスを作成します。次に、このオブジェクトのadd_subplotメソッドがすべてのプロットウィンドウに対して呼び出されます(非公式には、単一のサブプロットを構成するx軸とy軸について考えてください)。以下のように作成します(ページ上に1つだけか、複数か)。

fig.add_subplot(111)

この構文は次と同等です

fig.add_subplot(1,1,1)

あなたにとって意味のあるものを選択してください。

以下に、ページ上に2つのプロットを上下にプロットするコードをリストしました。フォーマットはadd_subplotに渡された引数を介して行われます。最初のプロットの引数は(211)であり、2番目のプロットは(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つの引数はそれぞれ、各プロットウィンドウをページに正しく配置するための完全な仕様です。

211(これも3タプル形式で(2,1,1)と書くこともできますが、プロットウィンドウの 2行 1列を意味します。3桁目は、他のサブプロットウィンドウに対するその特定のサブプロットウィンドウの順序を指定します。 -この場合、これは最初のプロット(行1に配置)なので、プロット番号1、行1列1になります。

add_subplotへの2番目の呼び出しに渡される引数は、最初の桁とは末尾の桁(1ではなく2)が異なるだけです。このプロットは2番目のプロット(行2、列1)だからです。

より多くのプロットの例:代わりに2x2マトリックス構成でページに4つのプロットが必要な場合、add_subplotメソッドを4回呼び出し、これらの4つの引数(221)、(222)、(223)、および( 224)、10、2、8、および4時の位置に、この順序でページ上に4つのプロットを作成します。

4つの引数のそれぞれに2つの先行2が含まれていることに注意してください。これは、2 x 2の構成、つまり2つの行と2つの列をエンコードします。

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


1
add_subplotは、少数のサブプロットに対して単一の整数引数を取ることができますが、9個を超えるサブプロットが必要になると、3つの別個の整数引数を取る他の回答からのバージョンを使用する必要があります。
user1244215 2013

1
fig.add_axes(rect)代わりに使用できadd_subplotますか?
Alcott、2013年

15
PLT?それが以前に使用されたことを見たことがない
Darshan Chaudhary

3
ここでの最初の段落は、実行するfor i in range(16): plt.subplot(4, 4, i+1)と構文エラーがないことを確認できるため、明らかに誤りです。おそらくOPが望んだことを行ったので、答えは受け入れられます。
chthonicdaemon 2017年

3
これは素晴らしいソリューションです。しかし、1つの変数を使用してループする場合は、どうすればよいですか?
Pengju Zhao 2017

83

この質問は4年前からのものなので、新しいものが実装されており、その中に非常に便利な新しい機能plt.subplotsがあります

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

どこaxesnumpy.ndarrayAxesSubplotオブジェクトのは、それは非常に便利なだけで配列のインデックスを使用して別のサブプロットを通過すること、[i,j]


これは、matplotlib APIのみを使用する必要がある場合にも機能しますか?
eudoxos 2015

2
@eudoxosはい、そうする必要があります。たとえば、何が行われているかを示す必要なく、1ページに複数のグラフィックスを印刷するために、このようなサブプロットを作成できます
Saullo GP Castro

12

これも機能します:

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

1ページに合計19のグラフをプロットします。形式は、下5、横4です。


4

@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):
drevicko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.