105 votes

Relation entre les ppp et la taille de la figure

J'ai créé une figure à l'aide de matplotlib mais je me suis rendu compte que l'axe du tracé et la ligne tracée sont déformés par le zoom. enter image description here

En lisant ceci de discussion précédent il explique comment définir la taille de la figure.

fig, ax = plt.subplots()

fig.set_size_inches(3, 1.5)

plt.savefig(file.jpeg, edgecolor='black', dpi=400, facecolor='black', transparent=True)

Avec le code ci-dessus (les autres configurations ont été supprimées pour des raisons de brièveté), j'obtiens un fichier image avec le code suivant 1200 X 600 les dimensions (ou la résolution) souhaitées et la taille de fichier souhaitée.

L'image projetée est mise à l'échelle d'une manière inhabituelle, les annotations par exemple sont agrandies. Bien que je puisse régler la taille des étiquettes sur l'axe, la figure n'a pas l'air proportionnelle par rapport à l'échelle puisque les épines du bas et de droite sont grandes, tout comme les lignes tracées.

La question est donc de savoir quelles sont les configurations qui ne vont pas.

2 votes

Je ne comprends pas bien le problème. Mais ce que je peux dire, c'est que lorsque les deux, la taille du chiffre en pouces y dpi, devrait être fixe, vous devez modifier la taille des objets que vous percevez comme "trop grands", c'est-à-dire réduire la taille des polices, la largeur des lignes, les signets, etc. En général, il suffit de fixer les ppp o la taille en pouces pour obtenir la silhouette souhaitée.

0 votes

@ImportanceOfBeingErnest J'ai créé une image qui s'est avérée avoir les dimensions souhaitées et la taille du fichier est dans la fourchette souhaitée. Cependant, le graphique dessiné s'est avéré être trop agrandi/réduit. En lisant d'autres fils de discussion, il semble qu'il y ait un problème d'échelle et de rapport d'aspect qui pourrait être en jeu. Votre suggestion de déclarer la taille de chaque élément semble plutôt inhabituelle, car je pense qu'il devrait y avoir un moyen d'ajuster automatiquement tous les éléments du canevas en fonction des paramètres précédemment définis de figsize() et de dpi.

0 votes

Permettez-moi de réessayer : Si, par exemple, la dimension du pixel est de 1200 X 600 vous créez généralement une figure de taille (12 x 6) pouces et 100 dpi, auquel cas les lignes sont probablement de taille adéquate. En revanche, avec une résolution de 400 ppp, chaque point de la figure est quatre fois plus grand. Apparemment, ce n'est pas ce que vous voulez. Mais si vous en avez besoin, vous pouvez réduire la taille des éléments (par exemple, faire en sorte que la ligne soit de 0,25 au lieu de 1). (Il n'y a pas de problème d'échelle ou d'aspect ici, c'est tout simplement la façon dont cela fonctionne et comme prévu).

228voto

ImportanceOfBeingErnest Points 119438

Taille de la figure ( figsize ) détermine la taille de la figure en pouces. Cela donne l'espace dont disposent les axes (et les autres éléments) à l'intérieur de la figure. La taille par défaut de la figure est (6.4, 4.8) Une taille de figure plus grande permet d'afficher des textes plus longs, plus d'axes ou plus d'étiquettes à cocher.

Points par pouce (ppp) détermine le nombre de pixels que comporte la figure. Le dpi par défaut dans matplotlib est de 100. Une figure de figsize=(w,h) aura

px, py = w*dpi, h*dpi  # pixels
# e.g.
# 6.4 inches * 100 dpi = 640 pixels

Ainsi, pour obtenir une figure avec une taille de pixel de par ex. (1200,600) vous pouvez choisir plusieurs combinaisons de taille de figure et de ppp, par exemple

figsize=(15,7.5), dpi= 80
figsize=(12,6)  , dpi=100
figsize=( 8,4)  , dpi=150
figsize=( 6,3)  , dpi=200
etc.

Maintenant, quelle est la différence ? Elle est déterminée par la taille des éléments à l'intérieur de la figure. La plupart des éléments comme les lignes, les marqueurs, les textes ont une taille donnée en points.
Les figures de Matplotlib utilisent Points par pouce (ppi) de 72. Une ligne d'une épaisseur de 1 point aura une largeur de 1./72. inch. Un texte avec une taille de police de 12 points aura une hauteur de 12./72. pouces.

Bien sûr, si vous changez la taille de la figure en pouces, les points ne changeront pas, donc une figure plus grande en pouces a toujours la même taille d'éléments. Changer la taille de la figure revient donc à prendre une feuille de papier d'une taille différente. Bien entendu, cela ne modifierait pas la largeur de la ligne tracée avec le même stylo.

En revanche, la modification des ppp met ces éléments à l'échelle. À 72 ppp, une ligne de 1 point est forte d'un pixel. À 144 dpi, cette ligne a une force de 2 pixels. Un ppp plus grand agira donc comme une loupe. Tous les éléments sont mis à l'échelle par le pouvoir grossissant de la lentille.

Une comparaison pour une taille de figure constante et des ppp variables est présentée dans l'image ci-dessous à gauche. Sur la droite, vous voyez un dpi constant et une taille de figure variable. Les figures de chaque rangée ont la même taille de pixel.

enter image description here

Code à reproduire :

import matplotlib.pyplot as plt
%matplotlib inline

def plot(fs,dpi):
    fig, ax=plt.subplots(figsize=fs, dpi=dpi)
    ax.set_title("Figsize: {}, dpi: {}".format(fs,dpi))
    ax.plot([2,4,1,5], label="Label")
    ax.legend()

figsize=(2,2)
for i in range(1,4):
    plot(figsize, i*72)

dpi=72
for i in [2,4,6]:
    plot((i,i), dpi)

3 votes

"Les figures de Matplotlib utilisent des points par pouce (ppi) de 72" - Où avez-vous trouvé cela ? Je ne le trouve nulle part. La seule chose que je peux trouver est que le DPI par défaut est de 100.

9 votes

@LoneLearner Oui, il n'y a qu'une référence très cachée dans la documentation à ce sujet dans le fichier tutoriel sur les transformations . Et bien sûr, c'est partout dans le code, par exemple. aquí .

0 votes

Comment définir le DPI sur un chiffre et le PPI sur un autre chiffre ? Tout ce que je vois, c'est que vous avez modifié la taille de la figure et le PPI pour subplots ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X