web-dev-qa-db-fra.com

MatplotLib 'saveFig ()' Plein écran

J'ai utilisé MatplotLib avec Cartopy pour générer des images de données. Le problème est que lorsque je règle la taille du cadre en plein écran et que j'utilise plt.show (), l'image est parfaite et la résolution est correcte.

Cependant, lorsque j'enregistre ce chiffre en utilisant 'plt.savefig ()', l'image enregistrée conserve sa taille d'origine (pas en plein écran).

Affichage des images des résultats:

Showing the image - not saving it

Saving the image - not showing it

Mon code est le suivant:

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

Peut-être que je dois définir un paramètre dans savefig () pour lui dire qu'il doit enregistrer mon cadre modifié? Quelqu'un peut-il m'aider pour ce problème?

Merci d'avance.

12
Hollweg

En venant de MATLAB, il n'est pas intuitif que votre figure affichée n'ait pas à affecter celle enregistrée en termes de dimensions, etc. Chacune est gérée par un backend différent, et vous pouvez modifier les dpi et size_inches comme vous le souhaitez.

L'augmentation du DPI va certainement vous aider à obtenir un grand chiffre, en particulier avec un format comme PNG, qui ne connaît pas la taille en pouces. Cependant, cela ne vous aidera pas à mettre le texte à l'échelle par rapport à la figure elle-même.

Pour ce faire, vous devrez utiliser l'API orientée objet, en particulier figure.set_size_inches , qui, je pense, n'a pas d'équivalent dans plt. Remplacer

plt.savefig(figName, dpi=500)

avec

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

La taille 8.5, 11 est la largeur et la hauteur du format de papier standard aux États-Unis, respectivement. Vous pouvez le régler à votre guise. Par exemple, vous pouvez utiliser la taille de votre écran, mais dans ce cas, assurez-vous également d'obtenir le DPI correct.

8
Mad Physicist