web-dev-qa-db-fra.com

Matplotlib: Spécifie le format des floats pour les étiquettes de tick

J'essaie de définir le format sur deux nombres décimaux dans un environnement de sous-parcelle Matplotlib. Malheureusement, je n'ai aucune idée de la façon de résoudre cette tâche.

Pour éviter d'utiliser la notation scientifique sur l'axe des y, j'ai utilisé ScalarFormatter(useOffset=False) comme vous pouvez le voir dans l'extrait ci-dessous. Je pense que ma tâche devrait être résolue en passant d’autres options/arguments au formateur utilisé. Cependant, je n'ai trouvé aucun indice dans la documentation de matplotlib.

Comment définir deux chiffres décimaux ou aucun (les deux cas sont nécessaires)? Je ne suis malheureusement pas en mesure de fournir des exemples de données.


- SNIPPET -

f, axarr = plt.subplots(3, sharex=True)

data = conv_air
x = range(0, len(data))

axarr[0].scatter(x, data)
axarr[0].set_ylabel('$T_\mathrm{air,2,2}$', size=FONT_SIZE)
axarr[0].yaxis.set_major_locator(MaxNLocator(5))
axarr[0].yaxis.set_major_formatter(ScalarFormatter(useOffset=False))
axarr[0].tick_params(direction='out', labelsize=FONT_SIZE)
axarr[0].grid(which='major', alpha=0.5)
axarr[0].grid(which='minor', alpha=0.2)

data = conv_dryer
x = range(0, len(data))

axarr[1].scatter(x, data)
axarr[1].set_ylabel('$T_\mathrm{dryer,2,2}$', size=FONT_SIZE)
axarr[1].yaxis.set_major_locator(MaxNLocator(5))
axarr[1].yaxis.set_major_formatter(ScalarFormatter(useOffset=False))
axarr[1].tick_params(direction='out', labelsize=FONT_SIZE)
axarr[1].grid(which='major', alpha=0.5)
axarr[1].grid(which='minor', alpha=0.2)

data = conv_lambda
x = range(0, len(data))

axarr[2].scatter(x, data)
axarr[2].set_xlabel('Iterationsschritte', size=FONT_SIZE)
axarr[2].xaxis.set_major_locator(MaxNLocator(integer=True))
axarr[2].set_ylabel('$\lambda$', size=FONT_SIZE)
axarr[2].yaxis.set_major_formatter(ScalarFormatter(useOffset=False))
axarr[2].yaxis.set_major_locator(MaxNLocator(5))
axarr[2].tick_params(direction='out', labelsize=FONT_SIZE)
axarr[2].grid(which='major', alpha=0.5)
axarr[2].grid(which='minor', alpha=0.2)
32
albert

Voir la documentation correspondante dans général et spécifiquement

from matplotlib.ticker import FormatStrFormatter

fig, ax = plt.subplots()

ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f'))

enter image description here

69
tacaswell

La réponse ci-dessus est probablement la bonne façon de le faire, mais cela n'a pas fonctionné pour moi. 

La manière de hacky qui l'a résolu pour moi était la suivante: 

ax = <whatever your plot is> 
# get the current labels 
labels = [item.get_text() for item in ax.get_xticklabels()]
# Beat them into submission and set them back again
ax.set_xticklabels([str(round(float(label), 2)) for label in labels])
# Show the plot, and go home to family 
plt.show()
10
sapo_cosmico

Si vous travaillez directement avec pyplot (plt) de matplotlib et si vous êtes plus familier avec la chaîne de formatage de style nouveau, vous pouvez essayer ceci:

from matplotlib.ticker import StrMethodFormatter
plt.gca().yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}')) # No decimal places
plt.gca().yaxis.set_major_formatter(StrMethodFormatter('{x:,.2f}')) # 2 decimal places

De la documentation :

class matplotlib.ticker.StrMethodFormatter (fmt) 

Utilisez une nouvelle chaîne de formatage (utilisée par str.format ()) pour formater le fichier cocher.

Le champ utilisé pour la valeur doit être libellé x et le champ utilisé pour la position doit être étiquetée pos.

0
CodeWarrior