Seite 1 von 1

Matplotlib wissenschaftliche Notation unterdruecken

Verfasst: Dienstag 26. März 2013, 17:22
von frixhax
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

Re: Matplotlib wissenschaftliche Notation unterdruecken

Verfasst: Mittwoch 27. März 2013, 13:53
von Sr4l
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.

Re: Matplotlib wissenschaftliche Notation unterdruecken

Verfasst: Mittwoch 27. März 2013, 14:54
von frixhax
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")

Re: Matplotlib wissenschaftliche Notation unterdruecken

Verfasst: Mittwoch 27. März 2013, 15:22
von Sr4l
Achso, jetzt verstehe ich. Der formatter "vereinfacht" die Skalar weil alle eine Gemeinsamen Offset haben. Benutze einfach `ScalarFormatter(useOffset=False)`.

mfG Lars

Re: Matplotlib wissenschaftliche Notation unterdruecken

Verfasst: Mittwoch 27. März 2013, 15:33
von frixhax
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

Re: Matplotlib wissenschaftliche Notation unterdruecken

Verfasst: Mittwoch 27. März 2013, 15:40
von Sr4l
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.

Re: Matplotlib wissenschaftliche Notation unterdruecken

Verfasst: Mittwoch 27. März 2013, 15:45
von frixhax
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.