web-dev-qa-db-fra.com

Comment supprimer une notation scientifique sur un tracé de log-log matplotlib

Je sais que cette question a déjà été posée, mais j’ai essayé toutes les solutions possibles et aucune d’entre elles n’a fonctionné pour moi.

J'ai donc un graphique log-log dans matplotlib, et j'aimerais éviter les notations scientifiques sur l'axe des x.

Ceci est mon code:

from numpy import array, log, pi
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import matplotlib.ticker as mticker

plt.rc('axes.formatter', useoffset=False)

tc = array([7499680.0, 12508380.0, 23858280.0, 34877020.0, 53970660.0, 89248580.0, 161032860.0, 326814160.0, 784460200.0])

theta = array([70, 60, 50, 45, 40, 35, 30, 25, 20])

plt.scatter(theta,tc)

ax=plt.gca()

ax.set_xscale('log')
ax.set_yscale('log')

ax.xaxis.set_major_formatter(mticker.ScalarFormatter())
ax.xaxis.get_major_formatter().set_scientific(False)
ax.xaxis.get_major_formatter().set_useOffset(False)

plt.show()

Et voici le résultat:  Output

Comme vous pouvez le constater, les nombres sur l'axe des x sont encore en notation scientifique. Je voudrais les afficher en tant que 20, 30, 40 ... J'ai essayé toutes les solutions possibles sans résultat.

Merci beaucoup à tous ceux qui aideront.

NB Je ne peux pas utiliser la commande plt.loglog (), car je fais un ajustement de la courbe sur les données et j'en ai besoin comme ça.

NB2. J'ai remarqué une chose très étrange: si je change le code en yaxis.get_mayor_formatter () ..., cela fonctionne sur l'axe des y! C'est juste sur le x que ça ne marche pas. Comment est-ce possible?

Edit: peut-être que ce n'est pas clair, mais si vous regardez le code, il existe 3 méthodes qui devraient affecter l'affichage des x-ticks: plt.rc('axes.formatter', useoffset=False), ax.xaxis.set_major_formatter(mticker.ScalarFormatter()) et ax.xaxis.get_major_formatter().set_scientific(False). Ce sont 3 méthodes qui devraient toutes faire l'affaire seules, selon ce que j'ai trouvé autour, mais elles ne le font pas. Bien sûr, je les ai aussi essayés un par un et pas tous ensemble. 

5
Francesco Boccardo

Ce sont des ticks mineurs sur l’axe des x (c’est-à-dire qu’ils ne sont pas sur des puissances entières de 10), pas des ticks majeurs. matplotlib détermine automatiquement s'il doit étiqueter les ticks majeurs ou mineurs - dans ce cas, parce que vous n'avez aucun tick important à afficher dans la plage x, les ticks mineurs sont étiquetés). Donc, vous devez utiliser la méthode set_minor_formatter:

ax.xaxis.set_minor_formatter(mticker.ScalarFormatter())

 enter image description here

Cela fonctionne sur l’axe des y parce que ces ticks sont des ticks majeurs (c’est-à-dire sur des puissances entières de 10) et non des ticks mineurs.

2
tmdavison

Si vous souhaitez désactiver les notations offset et scientifique, utilisez ax.ticklabel_format(useOffset=False, style='plain').

0
Aditya