2017-08-04 3 views
2

Ich benutzte MatplotLib mit Cartopy, um einige Datenbilder zu erzeugen. Das Problem ist, dass, wenn ich die Vollbildgröße auf Vollbild einstellen und plt.show() verwenden, das Bild perfekt ist und die Auflösung in Ordnung ist.MatplotLib 'saveFig()' Vollbild

Wenn ich diese Figur jedoch mit 'plt.savefig()' speichere, bleibt das gespeicherte Bild in Originalgröße (nicht Vollbild).

Zeige Ergebnis Bilder:

Showing the image - not saving it

Saving the image - not showing it

Mein Code ist folgende:

def plot_tec_cartopy (descfile): global matrixLon, matrixLat, matrixTec

ax = plt.axes(projection=cartopy.crs.PlateCarree()) 

v = np.linspace(0, 80, 46, endpoint=True) 
cp = plt.contourf(matrixLon, matrixLat, matrixTec, v, cmap=plt.cm.rainbow) 
plt.clim(0, 80) 
plt.colorbar(cp) 

ax.add_feature(cartopy.feature.COASTLINE) 
ax.add_feature(cartopy.feature.BORDERS, linestyle=':') 
ax.set_extent([-85, -30, -60, 15]) 

# Setting X and Y labels using LON/LAT format 
ax.set_xticks([-85, -75, -65, -55, -45, -35]) 
ax.set_yticks([-60, -55, -50, -45, -40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15]) 
lon_formatter = LongitudeFormatter(number_format='.0f', 
            degree_symbol='', 
            dateline_direction_label=True) 
lat_formatter = LatitudeFormatter(number_format='.0f', 
            degree_symbol='') 
ax.xaxis.set_major_formatter(lon_formatter) 
ax.yaxis.set_major_formatter(lat_formatter) 

plt.title('Conteúdo Eletrônico Total', style='normal', fontsize='12') 

# Acquiring Date 
year, julianday = check_for_zero(descfile.split('.')[2]), descfile.split('.')[3] 
hour, minute = descfile.split('.')[4], descfile.split('.')[5].replace('h','') 
date = datetime.datetime(int(year), 1, 1, int(hour), int(minute)) + datetime.timedelta(int(julianday)-1) 
month = date.month 
day = date.day 

# Set common labels 
ax.text(1.22, 1.05, 'TEC', style='normal', 
    verticalalignment='top', horizontalalignment='right', 
    transform=ax.transAxes, 
    color='black', fontsize=11) 
ax.text(1, 0.005, 'EMBRACE/INPE', style='italic', 
    verticalalignment='bottom', horizontalalignment='right', 
    transform=ax.transAxes, 
    color='black', fontsize=10) 
ax.text(1, 0.995, str(date) + ' UT', style='italic', 
    verticalalignment='top', horizontalalignment='right', 
    transform=ax.transAxes, 
    color='black', fontsize=10) 
ax.text(0.5, -0.08, 'Copyright \N{COPYRIGHT SIGN} 2017 INPE - Instituto Nacional de', 
    style='oblique', transform=ax.transAxes, 
    verticalalignment='bottom', horizontalalignment='center', 
    color='black', fontsize=8) 
ax.text(0.5, -0.108, 'Pesquisas Espacias. Todos direitos reservados', 
    style='oblique', transform=ax.transAxes, 
    verticalalignment='bottom', horizontalalignment='center', 
    color='black', fontsize=8) 

manager = plt.get_current_fig_manager() 
manager.resize(*manager.window.maxsize()) 

figName = 'tec.map' + '.' + str(year) + '.' + str(julianday) + '.' + str(hour) + '.' + str(minute) + 'h.png' 
#plt.show() 
plt.savefig(figName, dpi=500) 
plt.clf() 

Vielleicht muss ich einen Parameter in savefig() setzen, um es zu sagen, dass es meinen geänderten Rahmen speichern muss? Kann mir jemand bei diesem Problem helfen?

Vielen Dank im Voraus.

+0

Lassen Sie mich raten, MATLAB Benutzer, der die Figur auf dem Bildschirm irgendwie auf die Figur in der Datei bezogen erwartet? –

+0

Hilfreich, aber ich halte es nicht für einen Betrogenen: https://Stackoverflow.com/a/4306340/2988730. Ich entwerfe dir gerade eine Antwort. –

Antwort

2

von MATLAB kommend, ist es nicht intuitiv, dass Ihre angezeigte Wert nicht gespeichert eine in Bezug auf die Dimensionen beeinflussen hat, usw. Jeder von einem anderen Backend behandelt wird, und Sie können die dpi und size_inches wie Sie ändern wählen.

Das Erhöhen der DPI wird definitiv helfen, eine große Zahl zu bekommen, besonders mit einem Format wie PNG, das nicht über die Größe in Zoll weiß. Es wird Ihnen jedoch nicht helfen, den Text relativ zur Figur selbst zu skalieren.

Um dies zu tun, müssen Sie die objektorientierte API verwenden, speziell figure.set_size_inches, die ich glaube nicht, hat eine Entsprechung in plt.

ersetzen
plt.savefig(figName, dpi=500) 

mit

fig = plt.gcf() 
fig.set_size_inches((8.5, 11), forward=False) 
fig.save(figName, dpi=500) 

Die Größe 8.5, 11 ist die Breite und Höhe der Standardpapiergröße in der US, respectively. Sie können es einstellen, was Sie wollen. Zum Beispiel können Sie Ihre Bildschirmgröße verwenden, aber in diesem Fall stellen Sie sicher, dass auch die DPI richtig ist.

+0

Ihre Lösung ist großartig und löste das Problem! Danke für deine Antwort, Mad Physicist. :) – Hollweg

+1

Traditionell würdest du feiern, indem du die Antwort markierst, indem du auf das Häkchen daneben klickst, und dann aufhebst, wenn du den Ruf dafür hast. –

+0

@Hollweg Sie können nicht genug Ruf haben, um eine Antwort zu verbessern, aber Sie können immer die Antworten annehmen, die gut und nützlich für Sie sind. Akzeptieren Sie eine Antwort auf Ihre Frage und entfernen Sie Ihre Frage aus der "unbeantworteten" Liste, wie es sein sollte. – swatchai

Verwandte Themen