Matplotlib: Specificeer formaat van floats voor tick labels

Ik probeer het formaat in te stellen op twee decimale getallen in een matplotlib-subplotomgeving. Helaas heb ik geen idee hoe ik deze taak moet oplossen.

Om het gebruik van wetenschappelijke notatie op de y-as te voorkomen, heb ik ScalarFormatter(useOffset=False)gebruikt, zoals je kunt zien in mijn fragment hieronder. Ik denk dat mijn taak moet worden opgelost door verdere opties/argumenten door te geven aan de gebruikte formatter. Ik kon echter geen enkele hint vinden in de documentatie van matplotlib.

Hoe kan ik twee decimalen of geen cijfers instellen (beide gevallen zijn nodig)? Ik kan helaas geen voorbeeldgegevens verstrekken.


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

Antwoord 1, autoriteit 100%

Zie de relevante documentatie in algemeenen specifiek

from matplotlib.ticker import FormatStrFormatter
fig, ax = plt.subplots()
ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f'))

voer hier de afbeeldingsbeschrijving in


Antwoord 2, autoriteit 24%

Als je direct werkt met matplotlib’s pyplot (plt) en als je meer bekend bent met de nieuwe stijl format string, kun je dit proberen:

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

Van de documentatie:

klasse matplotlib.ticker.StrMethodFormatter(fmt)

Gebruik een nieuwe stijl format string (zoals gebruikt door str.format()) om de . op te maken
vink aan.

Het veld dat voor de waarde wordt gebruikt, moet het label x hebben en het veld dat wordt gebruikt voor
de positie moet worden gelabeld met pos.


Antwoord 3, autoriteit 16%

Het bovenstaande antwoord is waarschijnlijk de juiste manier om het te doen, maar werkte niet voor mij.

De hacky manier om het voor mij op te lossen was de volgende:

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

Other episodes