2015-07-16 13 views
7

Matplotlib kullanarak, normal bilimsel gösterimde görüntülenen metinlerime metin yazmak istiyorum, örneğin, 1.92x10 -7 yerine varsayılan 1,92e-7. Metin işlevi için değil, eksenlerdeki keneler etiketleme sayıları için bunu nasıl yapacağım konusunda yardım buldum. Bu onun Python dize gösteriminden sayısı için kendi tex dizesini oluşturmaktır yapmanınMatplotlib'de "e" bilimsel gösterimi yerine "X" ile sayıları gösterme

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

İlk düşüncesi biçimi yönteminin çıkış dönüştüren bir filtre işlevi olacaktır. Bu zaten yeterli mi, ve değilse, neden? Ve aksi halde: Kesinlikle bilimsel bir işaret, bir "x" yerine bir orta nokta olurdu ... – guidot

cevap

8

Biraz hacky yolu: İşte değiştirmek istiyorum benim kod bir örnektir. Aşağıda tanımlanan, as_si numaranızı ve ondalık basamak sayısını geçmek ve bu tex dize üretecek:

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

Bu, geldiğim yöntemden daha az hacky ve daha çok yönlü. Ancak, üssü biçimlendirmek için neden 3 iç içe geçmiş parantez gerektiğini anlamıyorum. Ben de onun "nedenini (m = m, e = int (e))" "değil" biçiminde (m, int (e)) "" anlamıyorum. –

+0

TeX çıktısında tek bir çift paranteze ihtiyacınız vardır ve yeni bir Python formatlı dizgede ikiye katlanarak ('{{' ve '}}') tek bir yazı dizisi elde edilir; named (keyword) formatı belirticileri, bunları "format" fonksiyonunda listelemenin bir alternatifi. – xnx

İlgili konular