2015-07-16 14 views
7

Używając matplotlib, chciałbym napisać tekst na moich działkach, który wyświetla się w normalnym zapisie naukowym, na przykład jako 1.92x10 -7 zamiast domyślne 1.92e-7. Znalazłem pomoc, jak to zrobić dla liczb oznaczających tyknięcia na osiach, ale nie dla funkcji tekstowej. Oto przykład z mojego kodu, które chciałbym zmienić:Wyświetlanie liczb z "X" zamiast "e" notacja naukowa w matplotlib

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0,0.5) 
y = x*(1.0-x) 

a=1.92e-7 

plt.figure() 
plt.plot(x, y) 
plt.text(0.01, 0.23, r"$a = {0:0.2e}$".format(a), size=20) 
plt.show() 
+1

Pierwsza idea byłaby funkcja filtr, który przekształca wyjście metody formatu. Czy to już wystarcza, a jeśli nie, dlaczego? A poza tym: ściśle notacja naukowa byłaby środkową kropką zamiast "x" ... – guidot

Odpowiedz

8

Nieco hacky to sposobem jest zbudowanie własnego tex ciąg na liczbę od jego reprezentacji Python strun. Przechodzą as_si, zdefiniowane poniżej swój numer oraz liczbę miejsc po przecinku i będzie produkować ten ciąg tex:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0,0.5) 
y = x*(1.0-x) 

def as_si(x, ndp): 
    s = '{x:0.{ndp:d}e}'.format(x=x, ndp=ndp) 
    m, e = s.split('e') 
    return r'{m:s}\times 10^{{{e:d}}}'.format(m=m, e=int(e)) 

a=1.92e-7 

plt.figure() 
plt.plot(x, y) 

plt.text(0.01, 0.23, r"$a = {0:s}$".format(as_si(a,2)), size=20) 
plt.show() 

enter image description here

+0

To mniej hacky i bardziej uniwersalne niż metoda, którą wymyśliłem. Jednak nie rozumiem, dlaczego 3 zagnieżdżone nawiasy klamrowe są potrzebne do sformułowania wykładnika. Nie rozumiem też, dlaczego ma format "(m = m, e = int (e))" ", a nie" "(m, int (e))". –

+0

Potrzebna jest jedna para nawiasów klamrowych na wyjściu TeX, a pojedynczy dosłowny nawias uzyskuje się poprzez podwojenie-up ('{{' i '}}') w nowo napisanym łańcuchu w stylu Python; Specyfikatory formatu nazwanego (słowa kluczowego) są alternatywą do wymieniania ich w funkcji 'format'. – xnx

Powiązane problemy