sauvegarde des images en python avec une très haute qualité

109

Comment puis-je enregistrer des tracés python de très haute qualité?

Autrement dit, lorsque je continue à zoomer sur l'objet enregistré dans un fichier pdf, il n'y a pas de flou?

De plus, quel serait le meilleur mode pour l'enregistrer?

png, eps? Ou un autre? Je ne peux pas faire pdfparce qu'il y a un nombre caché qui gâche la Latexmkcompilation.

poussiéreux
la source

Réponses:

153

Si vous utilisez matplotlibet essayez d'obtenir de bonnes figures dans un document latex, enregistrez-le au format eps. Plus précisément, essayez quelque chose comme ceci après avoir exécuté les commandes pour tracer l'image:

plt.savefig('destination_path.eps', format='eps')

J'ai trouvé que les fichiers eps fonctionnent le mieux et que le dpiparamètre est ce qui les rend vraiment beaux dans un document.

METTRE À JOUR:

Pour spécifier l'orientation de la figure avant d'enregistrer, appelez simplement ce qui suit avant l' plt.savefigappel, mais après avoir créé le tracé (en supposant que vous ayez tracé en utilisant un axe avec le nom ax):

ax.view_init(elev=elevation_angle, azim=azimuthal_angle)

elevation_angleest un nombre (en degrés) spécifiant l'angle polaire (par rapport à l'axe z vertical) et le azimuthal_anglespécifie l'angle azimutal (autour de l'axe z).

Je trouve qu'il est plus facile de déterminer ces valeurs en traçant d'abord l'image, puis en la faisant pivoter et en regardant les valeurs actuelles des angles apparaître vers le bas de la fenêtre juste en dessous du tracé réel. Gardez à l'esprit que les positions x, y, z apparaissent par défaut, mais sont remplacées par les deux angles lorsque vous commencez à cliquer + glisser + faire pivoter l'image.

spencerlyon2
la source
@ spencerlon2 et si je veux changer l'orientation de la figure avant de l'enregistrer?
dustin
13
Pourquoi avons-nous besoin du paramètre DPI? L'eps n'est-il pas un format vectoriel?
mkvoya
1
Bon point - DPI n'est pas nécessaire pour les formats vectoriels comme svg, pdf, eps
spencerlyon2
Vous pouvez omettre format='eps'si vous le souhaitez. Dans ce cas, le format est déduit du nom de fichier.
timgeb
72

Juste pour ajouter mes résultats, également en utilisant matplotlib.

.eps a rendu tout mon texte gras et supprimé la transparence. .svg m'a donné des images haute résolution qui ressemblaient en fait à mon graphique.

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
# Do the plot code
fig.savefig('myimage.svg', format='svg', dpi=1200)

J'ai utilisé 1200 dpi car beaucoup de revues scientifiques nécessitent des images en 1200/600/300 dpi en fonction de l'image. Convertissez en dpi et formatez en GiMP ou Inkscape.

EDIT: Évidemment, le dpi n'a pas d'importance puisque .svg sont des graphiques vectoriels et ont une "résolution infinie".

grofte
la source
2
Le DPI est très important lorsque nous utilisons imshow(..)quelque part sur la figure. Ces bitmaps sont pixellisés au fur et à mesure qu'ils sont intégrés dans le SVG. Avec le DPI par défaut, les résultats sont encore pires que ce que nous voyons à l'écran, définitivement inadaptés aux publications.
Evgeni Sergeev
Je recommande également vivement Scour ( github.com/scour-project/scour ) pour réduire la taille du fichier de votre svg. Sur le paramètre le plus agressif, je peux réduire la taille de mon fichier à 50% de l'original - 5% si j'utilise le format compressé .svgz.
grofte le
8

D'accord, j'ai trouvé que la réponse de spencerlyon2 fonctionnait, mais au cas où quelqu'un se trouverait ne pas savoir quoi faire avec cette ligne, je devais le faire de cette façon:

beingsaved = plt.figure()

# some scatters
plt.scatter(X_1_x, X_1_y)
plt.scatter(X_2_x, X_2_y)

beingsaved.savefig('destination_path.eps', format='eps', dpi=1000)
Jonatán Iván
la source
7

Dans le cas où vous travaillez avec graphiques Seaborn , au lieu de matplotlib, vous pouvez enregistrer une image .png comme ceci:

Supposons que vous ayez un matrix objet (pandas ou numpy) et que vous souhaitiez prendre une carte thermique:

import seaborn as sb

image = sb.heatmap(matrix)   # this gets you the heatmap
image.figure.savefig("C:/Your/Path/ ... /your_image.png")   # this saves it

Ce code est compatible avec la dernière version de seaborn. D'autres codes autour de stackoverflow ne fonctionnaient que pour les versions précédentes.

Une autre façon que j'aime est celle-ci. J'ai défini la taille de l'image suivante comme suit:

plt.subplots(figsize=(15,15))

Et plus tard, je trace la sortie dans la console, à partir de laquelle je peux la copier-coller où je veux. (Puisque seaborn est construit sur matplotlib, il n'y aura pas de problème.)

Leevo
la source
5

Vous pouvez enregistrer sur une figure de 1920 x 1080 (ou 1080p) à l'aide de:

fig = plt.figure(figsize=(19.20,10.80))

Vous pouvez également aller beaucoup plus haut ou plus bas. Les solutions ci-dessus fonctionnent bien pour l'impression, mais ces jours-ci, vous voulez que l'image créée aille au format PNG / JPG ou apparaisse dans un format grand écran.

Eamonn Kenny
la source