2015-10-29 20 views
5

Spędziłem trochę czasu bezowocnie szukając odpowiedzi na moje pytanie, więc myślę, że nowe pytanie jest w porządku. Rozważmy następujący wykres:Usuń skalę osi

![enter image description here

osiach etykiety użyć notacji naukowej. Na osi Y wszystko jest w porządku. Jednak próbowałem i nie udało mi się pozbyć współczynnika skalowania dodanego przez Python w prawym dolnym rogu. Chciałbym całkowicie usunąć ten czynnik i po prostu wskazać go przez jednostki w tytule osi lub pomnożyć je do każdej etykiety. Wszystko będzie wyglądać lepiej niż ten brzydki 1e14.

Oto kod:

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') 

Aktualizacja: realizacja włączenie Will of scientificNotation do mojego scenariusza, fabuła teraz wygląda

enter image description here

wiele lepsze jeśli chodzi o mnie. Poniżej znajduje się pełny kod dla każdego, kto chce przyjąć pewną jego część:

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) 

Odpowiedz

5

Wystarczy podzielić X-wartości przez 1e14:

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

Jeśli chcesz dodać etykietę do każdego kleszcza, ty Będziesz musiał podać custom formatter, jak w odpowiedzi Toma.

Jeśli chcesz to wyglądać tak miły jak kleszcze na swojej osi y, można zapewnić funkcję formatowania go LaTeX:

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) 

Oczywiście, to będzie zaśmiecać osi x w górę, więc możesz na przykład wyświetlić je pod kątem.

+0

Dzięki za cynk. Próbowałem to wcześniej i uważałem, że nie zadziałało, ponieważ wątek zniknął, a współczynnik skali pozostał. Zacząłem używać Pythona tylko wczoraj, więc założyłem, że był to jeden z wielu błędów składniowych popełnionych od tego czasu. Ale teraz, kiedy już to zrobiłeś, sprawdziłem ponownie i zdałem sobie sprawę, że za pierwszym razem poszło nie tak, ponieważ zapomniałem również dodać przeskalowanie do 'put.xlim', jak w' plt.xlim (right = max (data_a [:, 0])/1e14) '. – Casimir

+0

Czy znasz również sposób, aby czynnik pojawiał się na każdej etykiecie? Oznaczałoby to o wiele mniej błądzenia w przypadku zmiany kolejności znaczników osi. – Casimir

+0

@asimimir: tak, musisz ustawić "formatter". Zobacz moją odpowiedź – tom

2

Poza dobrą odpowiedź od Will Vousden można ustawić co piszesz w swoim kleszczy z:

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

pierwszy range(6) jest lokalizacja, a drugi jest etykieta.

3

Można również zmienić program do wyboru kleszczy za pomocą modułu ticker.

Przykładem może być użycie FormatStrFormatter:

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

Zobacz także odpowiedź here z dużą ilością dobrych pomysłów sposobów, aby rozwiązać ten problem.

+0

To fajne, ale czy istnieje sposób na wydrukowanie etykiet 'x', takich jak etykiety' y', np. Jako '4 x 10^14' zamiast' 4e + 14'? – Casimir

+0

Tak, myślę, że widziałeś, że odpowiedź @ WillVousdena już to robi – tom