web-dev-qa-db-fra.com

Relation entre dpi et la taille de la figure

J'ai créé une figure à l'aide de matplotlib mais j'ai réalisé l'axe du tracé et la ligne tracée est agrandie. enter image description here

En lisant ceci fil 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 (autres configurations supprimées pour plus de brièveté), je reçois un fichier image résultant avec 1200 X 600 dimensions souhaitées (faut-il dire aussi résolution?) et taille de fichier souhaitée.

L'image projetée est redimensionnée de manière inhabituelle, les annotations par exemple sont agrandies. Bien que je puisse définir la taille des étiquettes sur l'axe, le chiffre ne semble pas proportionnel à l'échelle, car les épines inférieure et droite sont grandes, de même que les lignes tracées.

La question est donc de savoir quelles configurations vont mal.

27
qboomerang

La taille de la figure (figsize) détermine la taille de la figure en pouces. Cela donne la quantité d'espace que les axes (et autres éléments) ont à l'intérieur de la figure. La taille de figure par défaut est (6.4, 4.8) Pouces dans matplotlib 2. Une taille de figure plus grande permet d'afficher des textes plus longs, plus d'axes ou plus de étiquettes de niveau.

Le nombre de points par pouce (dpi) détermine le nombre de pixels compris dans ce chiffre. La résolution par défaut dans matplotlib est 100. Un chiffre de figsize=(w,h) aura

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

Donc, pour obtenir un chiffre avec une taille de pixel de par ex. (1200,600), Vous pouvez choisir plusieurs combinaisons de taille de figure et de dpi, 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? Ceci est déterminé par la taille des éléments à l'intérieur de la figure. La plupart des éléments tels que les lignes, les marqueurs et les textes ont une taille en points.
Les chiffres de Matplotlib utilisent points par pouce (ppi) sur 72. Une ligne d'épaisseur 1 point sera 1./72. pouces de large. Un texte avec une taille de police de 12 points sera 12./72. pouce de hauteur.

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

Par ailleurs, la modification de la résolution dpi redimensionne ces éléments. À 72 dpi, une ligne de 1 point est haute d'un pixel. À 144 dpi, cette ligne a une hauteur de 2 pixels. Un dpi plus grand se comportera donc comme une loupe. Tous les éléments sont mis à l’échelle par le pouvoir grossissant de l’objectif

Un comparisson pour la taille de la figure constante et la variation du dpi est indiqué dans l'image ci-dessous à gauche. Sur la droite, vous voyez un dpi constant et une taille de chiffre variable. Les chiffres de chaque ligne ont la même taille en pixels.

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