2015-10-29 24 views
5

Sorusuna cevap aramak için biraz zaman harcadım, bu yüzden yeni bir sorunun olduğunu düşünüyorum. Bu arsa düşünün:Eksen ölçeğini kaldırın

![enter image description here

etiketler bilimsel gösterim kullanabilirsiniz eksenleri. Y ekseninde, her şey yolunda. Ancak, Python'un sağ alt köşeye eklediği ölçekleme faktörünü ortadan kaldırmayı denedim ve başaramadım. Bu faktörü tamamen kaldırmak istiyorum ve bunu eksen başlığındaki birimlerle belirtmek veya her bir etiketle çarpmak istiyorum. Her şey bu çirkin 1e14'dan daha iyi görünecekti.

import numpy as np data_a = np.loadtxt('exercise_2a.txt') 

import matplotlib as mpl 
font = {'family' : 'serif', 
     'size' : 12} 
mpl.rc('font', **font) 

import matplotlib.pyplot as plt 
fig = plt.figure() 
subplot = fig.add_subplot(1,1,1) 

subplot.plot(data_a[:,0], data_a[:,1], label='$T(t)$', linewidth=2) 

subplot.set_yscale('log')    
subplot.set_xlabel("$t[10^{14}s]$",fontsize=14) 
subplot.set_ylabel("$T\,[K]$",fontsize=14) 
plt.xlim(right=max(data_a [:,0])) 
plt.legend(loc='upper right') 

plt.savefig('T(t).pdf', bbox_inches='tight') 

Güncelleme:

İşte kod bana sorarsanız

enter image description here

Çok güzel

gibi senaryom içine scientificNotation arasında birleştirilerek Will'in uygulanması, arsa şimdi görünüyor.

import numpy as np 
data = np.loadtxt('file.txt') 

import matplotlib as mpl 
font = {'family' : 'serif', 
     'size' : 16} 
mpl.rc('font', **font) 

import matplotlib.pyplot as plt 
fig = plt.figure() 
subplot = fig.add_subplot(1,1,1) 

subplot.plot(data[:,0], data[:,1], label='$T(t)$', linewidth=2) 

subplot.set_yscale('log') 
subplot.set_xlabel("$t[s]$",fontsize=20) 
subplot.set_ylabel("$T\,[K]$",fontsize=20) 
plt.xlim(right=max(data [:,0])) 
plt.legend(loc='upper right') 

def scientificNotation(value): 
    if value == 0: 
     return '0' 
    else: 
     e = np.log10(np.abs(value)) 
     m = np.sign(value) * 10 ** (e - int(e)) 
     return r'${:.0f} \cdot 10^{{{:d}}}$'.format(m, int(e)) 

formatter = mpl.ticker.FuncFormatter(lambda x, p: scientificNotation(x)) 
plt.gca().xaxis.set_major_formatter(formatter) 


plt.savefig('T(t).pdf', bbox_inches='tight', transparent=True) 

cevap

5

Sadece 1e14 tarafından x-değerleri ayırmak:

subplot.plot(data_a[:,0]/1e14, data_a[:,1], label='$T(t)$', linewidth=2) 

Tek tek her bir kene etiket eklemek istiyorsanız, İşte herkes bunun bir kısmını kabul etmek isteyen için tam kod Tom'un cevabı gibi bir custom formatter vermeliyim.

Eğer bu sizin y ekseninde keneler kadar güzel gibi görünmek istiyorsanız, LaTeX ile biçimlendirmek için bir işlev sağlayabilir: Elbette

def scientificNotation(value): 
    if value == 0: 
     return '0' 
    else: 
     e = np.log10(np.abs(value)) 
     m = np.sign(value) * 10 ** (e - int(e)) 
     return r'${:.0f} \times 10^{{{:d}}}$'.format(m, int(e)) 

# x is the tick value; p is the position on the axes. 
formatter = mpl.ticker.FuncFormatter(lambda x, p: scientificNotation(x)) 
plt.gca().xaxis.set_major_formatter(formatter) 

, bu xeksenini yığılmayı olacak biraz yukarı, örneğin, onları bir açıyla göstermeye ihtiyacınız olabilir.

plt.xticks(range(6), range(6)) 

ilk range(6) konumdur ve ikinci etikettir:

+0

Bahşiş için teşekkürler. Kısa bir süre önce bunu denedim ve işe yaramadığını düşündüm, çünkü arsa ortadan kayboldu ve ölçek faktörü kaldı. Sadece dün Python kullanmaya başladım, o zamandan beri yapılan birçok sözdizimi hatası olduğunu düşündüm. Ama şimdi sen de onu getirdin, tekrar kontrol ettim ve ilk kez yanlış olduğunu fark ettim çünkü plt.xlim'de olduğu gibi, 'put.xlim' için yeniden ölçeklendirmeyi eklemeyi unutmuştum (sağda = max (data_a) [: 0])/1e14) '. – Casimir

+0

Ayrıca, her onay etiketinde faktörü görmenin bir yolunu biliyor musunuz? Bu, eksen etiketlerinin büyüklüğü sırasının değişmesi durumunda daha az uğraşmak anlamına gelir. – Casimir

+0

@Casimir: Evet, 'formatter' ayarlamalısınız. Cevabımı görün – tom

2

Will Vousden iyi cevaba ek olarak, sizinle kene ne yazmak ayarlayabilirsiniz.

3

Ayrıca, onay biçimlendiricisini ticker modülüyle de değiştirebilirsiniz. Ayrıca, bu çözmek için yollar iyi fikirler bir sürü cevapları here bkz

import matplotlib.pyplot as plt 
import matplotlib.ticker as ticker 

fig,ax = plt.subplots() 
ax.semilogy(np.linspace(0,5e14,50),np.logspace(3,7,50),'b-') 
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.0e')) 

enter image description here

:

örnek bir FormatStrFormatter kullanmak olacaktır.

+0

Bu harika, ancak 'x' etiketlerini tıpkı' y' etiketleri gibi, yani '4e + 14' yerine' 4 x 10^14' olarak basmanın bir yolu var mı? – Casimir

+0

Evet, Sanırım WillVousden'ın cevabı bunu zaten yaptı – tom