2013-07-09 6 views
9

Betrachten (Angenommen Code läuft ohne Fehler) zu speichern:Unable matplotlib.figure Figur, Leinwand ist keine

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

Ich möchte jetzt speichern meine Figur mit fig.savefig(outputPath, dpi=300), aber ich bekomme AttributeError: 'NoneType' object has no attribute 'print_figure', weil fig.canvas ist None. Die Sub-Plots sollten sich auf dem Canvas der Figuren befinden, also sollte es nicht None sein. Ich denke, ich vermisse ein Schlüsselkonzept über Matplot Figuren Leinwand. Wie kann ich fig.canvas aktualisieren, um die aktuelle Figur zu reflektieren, so kann ich fig.savefig(outputPath, dpi=300) verwenden? Vielen Dank!

Antwort

11

Eines der Dinge, die plt.figure für Sie tut, ist das Backend für Sie zu streiten, und dazu gehört auch das Einrichten der Zeichenfläche. Die Art und Weise, wie die Architektur von mpl ist Artist Ebene Objekte wissen, wie man sich aufstellt, stellen Sie sicher, dass alles an der richtigen Stelle relativ zueinander usw. ist und dann, wenn Sie gefragt werden, ziehen Sie sich selbst auf die Leinwand. Obwohl Sie Teilpläne und Linien eingerichtet haben, haben Sie die Leinwand noch nicht verwendet. Wenn Sie versuchen, die Figur zu speichern, bitten Sie die Leinwand, alle Künstler zu bitten, sich darauf zu beziehen. Sie haben keine Arbeitsfläche erstellt (die für ein bestimmtes Backend spezifisch ist), so dass sie sich beschwert.

dem Beispiel folgend here Sie eine Leinwand erstellen müssen Sie in Ihrem tk Anwendung einbetten können (im Anschluss an die letzte Frage)

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

canvas ein Tk Widget ist und zu einer gui hinzugefügt werden können.

Wenn Sie nicht Ihre Figur einbetten möchten in Tk Sie die reinen OO Methoden gezeigt können here (Code direkt von Link angehoben):

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') 
+0

Dank macht Sinn! – TheoretiCAL

1

Ihr Beispielcode wurde nicht vollständig genug für mich laufen sie meine Antwort zu überprüfen, und es könnte davon abhängen, wie ‚matfig‘ definiert ist, aber ich werde erraten, dass Sie wollen, was ist:

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

nicht:

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

Abbildung ist die Modulmethode, die Sie aufrufen/aufrufen sollten.

Abbildung ist der oberste Container für alle Plot-Elemente, obwohl es etwas komplizierter ist.

+0

Wenn Sie sich seine vorherige Frage anschauen, versucht er dies ohne Verwendung von 'pyplot' – tacaswell

+0

import matplotlib.figure als matfig, wie tcaswell sagte, ich schreibe meinen pyplot Code mit Abbildung um und war nicht sicher, wie ich übersetzen soll it complefty – TheoretiCAL

+0

Ich habe die andere Frage von TheoretiCAL nicht gesehen, um den zusätzlichen Kontext über das zu bieten, was wirklich gewollt ist.Ich habe gerade geantwortet, wie man die "NoneType" -Fehlermeldung von savefig loswird, die er oben zeigt, basierend auf seiner Anweisung "Angenommen, Code läuft ohne Fehler". Meine Antwort bezieht sich auf diese begrenzte Aussage des Problems, auf die ich schon einmal gestoßen bin. – cloudpoint

0

Matplotlib kann sehr verwirrend sein.

Was ich tun möchte, ist die Methode figure() und nicht die Methode Figure(). Vorsicht bei der Großschreibung. Wenn Sie im folgenden Beispielcode figur = plt.Figure() haben, erhalten Sie den Fehler, der in der Frage enthalten ist. Mit Hilfe von figure = plt.figure() wird die Leinwand für Sie erstellt.

Hier ist ein Beispiel, das auch einen kleinen Leckerbissen über die Größenänderung Ihres Bildes enthält, da Sie auch Hilfe dazu brauchten.

################################# 
# Importing Modules 
################################# 
import numpy 
import matplotlib.pyplot as plt 


################################# 
# Defining Constants 
################################# 
x_triangle = [0.0, 6.0, 3.0] 
y_triangle = [0.0, 0.0, 3.0 * numpy.sqrt(3.0)] 
x_coords = [4.0] 
y_coords = [1.0] 
big_n = 5000 
# file_obj = open('/Users/lego/Downloads/sierpinski_python.dat', 'w') 
figure = plt.figure() 
axes = plt.axes() 



################################# 
# Defining Functions 
################################# 
def interger_function(): 
    value = int(numpy.floor(1+3*numpy.random.rand(1)[0])) 
    return value 


def sierpinski(x_value, y_value, x_traingle_coords, y_triangle_coords): 
    index_for_chosen_vertex = interger_function() - 1 
    x_chosen_vertex = x_traingle_coords[index_for_chosen_vertex] 
    y_chosen_vertex = y_triangle_coords[index_for_chosen_vertex] 
    next_x_value = (x_value + x_chosen_vertex)/2 
    next_y_value = (y_value + y_chosen_vertex)/2 
    return next_x_value, next_y_value 



################################# 
# Performing Work 
################################# 

for i in range(0, big_n): 
    result_from_sierpinski = sierpinski(x_coords[i], y_coords[i], x_triangle, y_triangle) 
    x_coords.append(result_from_sierpinski[0]) 
    y_coords.append(result_from_sierpinski[1]) 

axes.plot(x_coords, y_coords, marker = 'o', color='darkcyan', linestyle='none') 
plot_title_string = "Sierpinski Gasket with N = " + str(big_n) 
plt.title(plot_title_string) 
plt.xlabel('x coodinate') 
plt.ylabel('y coordinate') 
figure.set_figheight(10) 
figure.set_figwidth(20) 
file_path = '{0}.png'.format(plot_title_string) 
figure.savefig(file_path, bbox_inches='tight') 
plt.close() 
# plt.show()