Matplotlib wissenschaftliche Notation unterdruecken

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
frixhax
User
Beiträge: 39
Registriert: Donnerstag 21. April 2011, 14:06

Hi Leute,
ich hab schon wild gegoogelt, aber jeder Ansatz blieb bisher erfolglos. Ich habe einen Plot, dessen Y-Achse durschnittliche Werte aufweist (Groessenordnung 10). Trotzdem macht matplotlib da wissenschaftliche Notation draus, was voellig unsinnig ist (ich glaube, weil das Intervall (y_min, y_max) recht klein ist, 0.1). Dies geschieht nur bei diesem einen Plot. Bei anderen Datensaetzen mit groesserem Intervall (~1) ist die Achse bei gleichem Code normal skaliert. Nun habe ich versucht die wissenschaftliche Notation zu unterdruecken. Der Ansatz, den ich dazu in Foren gefunden habe, ist ueber den Formatter. Ich habe es versucht mit folgendem Code, aber ohne Effekt:

Code: Alles auswählen

plt.figure("i_only", figsize=(14.40, 9.00), dpi=100)
plt.plot(np.asarray(mod_mjd_list_i), np.asarray(x_i), 'r-', label = 'i_s')
ax = plt.gca()
formy = plt.ScalarFormatter()
formy.set_powerlimits((-5, 5))
formy.set_scientific(False)
ax.yaxis.set_major_formatter(formy)
Mache ich da etwas falsch? Gibt es eine einfachere Methode?

Gruss
frix
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Du setzt den Formatter nur für die y-Achse, für die x-Achse müsstest du das auchnoch machen wenn das gewünscht ist. Ansonsten sieht dein Code richtig aus, überprüfen kann ich es nicht weil der Code nicht lauffähig ist.
Benutzeravatar
frixhax
User
Beiträge: 39
Registriert: Donnerstag 21. April 2011, 14:06

Das mit der Y-Achse ist schon in Ordnung, die X-Achse enthaelt immer dieselbe Werte, die werden auch immer plain formatiert.
Hier ein lauffaehiges Beispiel; an der y-Achse steht wissenschaftliche Notation und ich bekomme sie nicht weg:

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

y_i = [11.1044563514, 11.1228276748, 11.1361234115, 11.1298162168, 11.125134152199999]
y_r = [11.148667168999999, 11.10194503, 11.112352465300001, 11.111687871799999, 11.1214449011]
dates_i = [2.83611000e-01,   2.69330463e+02, 2.70280648e+02,   2.72320822e+02, 2.73250579e+02]
dates_r = [311.28215,   324.25844,   325.25194,   330.20983,   338.21356]
        
diff = 0.16
ra = [112.5379659, 110.5349726]
dec = [ -15.9841039, -16.1061281]
med_i = np.median(y_i)
med_r = np.median(y_r)

plt.figure("i_only", figsize=(14.40, 9.00), dpi=100)
if y_r == []:
    plt.plot(dates_i, np.asarray(y_i), 'r-', label = 'i_s')
    plt.title('i_mag', fontsize='16')
else:
    plt.plot(dates_r, np.asarray(y_r), 'g-', label = 'r_s')
    plt.plot(dates_i, np.asarray(y_i), 'r-', label = 'i_s')
    plt.title('i_mag', fontsize='16')
plt.rcParams['xtick.major.pad']=10
plt.rcParams['ytick.major.pad']=10
ax = plt.gca()
ax.title.set_y(1.1)
formy = plt.ScalarFormatter()
formy.set_powerlimits((-5, 5))
formy.set_scientific(False)
ax.yaxis.set_major_formatter(formy)
ax.set_ylim(ax.get_ylim()[::-1])
for tick in ax.xaxis.get_major_ticks():
    tick.label.set_fontsize(16)
for tick in ax.yaxis.get_major_ticks():
    tick.label.set_fontsize(16)
plt.xlabel('Days', fontsize='20', labelpad=20)
plt.ylabel('normalized magnitude / mag', fontsize='20', labelpad=20)

if y_r == []:
    plt.legend(bbox_to_anchor=(0., 1.02, 1., 0.102), loc=3, mode='expand',
               numpoints=1, ncol=2, borderaxespad=0.)
else:
    plt.legend(bbox_to_anchor=(0., 1.02, 1., 0.102), loc=3, mode='expand',
               numpoints=1, ncol=2, borderaxespad=0.)
leg = plt.gca().get_legend()
ltext = leg.get_texts()
plt.setp(ltext, fontsize='16')
plt.savefig('lc0.png', facecolor='white', bbox_inches='tight')
plt.close("i_only")
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Achso, jetzt verstehe ich. Der formatter "vereinfacht" die Skalar weil alle eine Gemeinsamen Offset haben. Benutze einfach `ScalarFormatter(useOffset=False)`.

mfG Lars
Benutzeravatar
frixhax
User
Beiträge: 39
Registriert: Donnerstag 21. April 2011, 14:06

Juhu, das funktioniert! Kannst du mich erleuchten und mir sagen, was das tut bzw. warum ich das sezten muss, damit

Code: Alles auswählen

formy.set_powerlimits((-5, 5))
formy.set_scientific(False)
funktioniert? Auf der matplotlib-homepage finde ich nichts naeheres dazu.

Viele Gruesse
frix
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Man muss das nicht setzen damit powerlimits funktioniert. powerlimits funktioniert auch so.

Powerlimits entscheidet wann eine Zahl als 10000 oder als 1e4 geschrieben wird.

Offset bestimmt bei einer Reihe Anzahlen ob: [1.004 Mio, 1.005 Mio, 1.006 Mio] oder als [4000, 5000, 6000] + 1Mio dargestellt wird.

Beides hängt in sofern zusammen das [4000, 5000, 6000] auch wieder als [4e3, 5e3, 6e3] dargestellt werden könnte.
Benutzeravatar
frixhax
User
Beiträge: 39
Registriert: Donnerstag 21. April 2011, 14:06

Ah ok, danke. Ich war davon ausgegangen, dass set_powerlimits((-5, 5)) alleine schon bewirkt, dass Zahlen -100.000 < x < 100.000 generell nicht exponentiall dargestellt werden.
Antworten