12

考慮してください(コードがエラーなしで実行されると仮定します):

import matplotlib.figure as matfig

    ind = numpy.arange(N)
    width = 0.50;
    fig = matfig.Figure(figsize=(16.8, 8.0))
    fig.subplots_adjust(left=0.06, right = 0.87)
    ax1 = fig.add_subplot(111)
    prev_val = None
    fig.add_axes(ylabel = 'Percentage(%)',xlabel='Wafers',title=title,xticks=(ind+width/2.0,source_data_frame['WF_ID']))
    fig.add_axes(ylim=(70,100))

    for key,value in bar_data.items():
        ax1.bar(ind,value, width,color='#40699C', bottom=prev_val)
        if prev_val:
            prev_val = [a+b for (a,b) in zip(prev_val,value)]
        else:
            prev_val=value

    names= []
    for i in range(0,len(col_data.columns)):
        names.append(col_data.columns[i])
    ax1.legend(names,bbox_to_anchor=(1.15, 1.02))

で図を保存したいのですが、は Noneであるためfig.savefig(outputPath, dpi=300)、 が得られます。サブ プロットは Figure キャンバス上にある必要があるため、None にすることはできません。matplot フィギュア キャンバスに関する重要な概念が欠けていると思います。現在のフィギュアを反映するように fig.canvas を更新するにはどうすればよいですか? ありがとう!AttributeError: 'NoneType' object has no attribute 'print_figure'fig.canvasfig.savefig(outputPath, dpi=300)

4

3 に答える 3

16

あなたに代わって行うことの 1 つはplt.figure、バックエンドをラングリングすることです。これには、キャンバスのセットアップが含まれます。mpl のアーキテクチャは、Artistオブジェクトが自分自身を設定する方法を知っているレベルであり、すべてが互いに適切な場所にあることを確認し、求められたら自分自身をキャンバスに描画します。したがって、サブプロットと線を設定しても、実際にはまだキャンバスを使用していません。フィギュアを保存しようとすると、キャンバスにすべてのアーティストに自分自身を描くように依頼しています。キャンバス(特定のバックエンドに固有のもの)を作成していないため、文句を言います。

ここの例に従って、tk アプリケーションに埋め込むことができるキャンバスを作成する必要があります (最後の質問に続きます)。

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
canvas = FigureCanvasTkAgg(f, master=root)

canvasTkウィジェットであり、GUI に追加できます。

フィギュアを埋め込みたくない場合は、ここにTk示す純粋なOOメソッドを使用できます(リンクから直接持ち上げたコード):

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure

fig = Figure()
canvas = FigureCanvas(fig)
ax = fig.add_subplot(111)
ax.plot([1,2,3])
ax.set_title('hi mom')
ax.grid(True)
ax.set_xlabel('time')
ax.set_ylabel('volts')
canvas.print_figure('test')
于 2013-07-09T03:35:04.727 に答える
1

あなたのサンプル コードは、私の答えを確認するために実行するには十分ではありませんでした。それは、「matfig」の定義方法に依存する可能性がありますが、あなたが望むものは次のとおりであると推測します。

fig = matfig.figure(figsize=(16.8, 8.0))

いいえ:

fig = matfig.Figure(figsize=(16.8, 8.0))

figure は、呼び出す/呼び出す必要があるモジュール メソッドです。

Figure は、すべてのプロット要素の最上位のコンテナーですが、これより少し複雑です。

于 2013-07-09T03:51:50.543 に答える