web-dev-qa-db-ja.com

matplotlibを使用して単一ページに複数のプロットを作成する方法は?

一度に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()
78
FS.

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

15
las3rjock

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のFigureインスタンスを作成します。このオブジェクトのadd_subplotメソッドは、すべてのプロットウィンドウに対して呼び出されます(xとy軸が単一のサブプロットで構成されると考えてください)。次のように作成します(1ページに1つだけを作成する場合も、複数のページを作成する場合も)

fig.add_subplot(111)

この構文は次と同等です

fig.add_subplot(1,1,1)

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

以下に、ページ上に2つのプロットを上下にプロットするコードをリストしました。フォーマットは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つの引数はそれぞれ、ページ上にそれぞれのプロットウィンドウを正しく配置するための完全な仕様です。

211(これも(2,1,1)はプロットウィンドウの2行および1列; 3桁目は、他のサブプロットウィンドウに対する特定のサブプロットウィンドウ-この場合、これは最初のプロット(行1に配置)であるため、プロット番号1、行1列1です。

add_subplotの2回目の呼び出しに渡される引数は、1番目とは異なり、末尾の数字(1ではなく2)が異なるのは、このプロットが2番目のプロット(行2、列1)であるためです。

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

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

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

188
doug

この質問は4年前のものであるため、新しいものが実装されており、その中に 非常に便利な新しい関数plt.subplots があります。

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

ここで、axesはAxesSubplotオブジェクトのnumpy.ndarrayであり、配列インデックス[i,j]を使用するだけで異なるサブプロットを通過するのに非常に便利です。

77

これも機能します:

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

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

10
FS.

@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()
2
Pengju Zhao