2013-07-09 10 views
9

Considerate (Si supponga codice viene eseguito senza errori):Impossibile salvare matplotlib.figure figura, tela è None

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

io ora voglio salvare la mia figura con fig.savefig(outputPath, dpi=300), ma ho AttributeError: 'NoneType' object has no attribute 'print_figure', perché fig.canvas vale None. Le trame secondarie dovrebbero trovarsi sulla tela delle figure, quindi non dovrebbe essere None. Penso che mi manchi un concetto chiave riguardo le figure matplot. Come posso aggiornare fig.canvas in modo che rifletta la figura attuale, quindi posso usare fig.savefig(outputPath, dpi=300)? Grazie!

risposta

11

Una delle cose che plt.figure fa per te è il backend per te, e questo include la configurazione del canvas. Il modo in cui l'architettura di mpl è gli oggetti di livello Artist sa come impostarsi, assicurarsi che tutto sia nel posto giusto l'uno rispetto all'altro e quindi, quando richiesto, disegnarli sul canvas. Pertanto, anche se hai impostato sottotrame e linee, non hai ancora utilizzato la tela. Quando provi a salvare la figura, chiedi alla tela di chiedere a tutti gli artisti di disegnare su di essa. Non hai creato una tela (che è specifica per un dato back-end) quindi si lamenta.

Seguendo l'esempio here è necessario creare una tela è possibile incorporare nella vostra applicazione tk (Sulla scia tua ultima domanda)

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

canvas è un widget Tk e può essere aggiunto a una gui.

Se non si desidera incorporare la tua figura in Tk è possibile utilizzare i puri OO metodi illustrati here (codice sollevato direttamente dal link):

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

Grazie ha un senso! – TheoretiCAL

1

Il codice di esempio non era completo abbastanza per me per eseguirlo per verificare la mia risposta, e potrebbe dipendere da come 'matfig' è definito, ma ho intenzione di indovinare che quello che vuoi è:

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

:

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

figura è il metodo del modulo che è necessario richiamare/chiamare.

Figura è il contenitore di livello superiore per tutti gli elementi della trama, anche se è leggermente più complicato di così.

+0

Se si guarda alla sua domanda precedente, si tenta di farlo senza usare 'pyplot' – tacaswell

+0

import matplotlib.figure come matfig, come dichiarato da tcaswell, sto riscrivendo il mio codice pyplot con la figura e non ero sicuro di come tradurre it completelty – TheoretiCAL

+0

Non ho visto l'altra domanda di TheoretiCAL per fornire il contesto extra su ciò che è veramente voluto.Ho appena risposto a come sbarazzarmi del messaggio di errore "NoneType" di savefig che mostra sopra in base alla sua istruzione "Assume che il codice venga eseguito senza errori". La mia risposta si applica a questa affermazione limitata del problema, che ho incontrato prima. – cloudpoint

0

Matplotlib può essere molto confuso.

Quello che mi piace fare è usare il metodo figure() e non il metodo Figure(). Attento con la maiuscola. Nel codice di esempio seguente, se hai figure = plt.Figure() otterrai l'errore che è nella domanda. Usando figure = plt.figure() la tela viene creata per te.

Ecco un esempio che include anche un piccolo bocconcino sul ridimensionamento dell'immagine come volevi anche aiuto su quello.

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