2016-01-25 15 views
7

plt.ticklabel_format(axis='y',style='sci',scilimits=(0,3))'un diğer şeylerini kullanarak, matplotlib'de aşağıdaki çizimi yapıyorum. Bu yüzden bir y eksenini verir: Bilimsel eksen ile çizme, anlamlı sayıların sayısını değiştirme

enter image description here

Şimdi problem ben y ekseni [0, -2, -4, -6, -8, -12] gelen kene istiyorum olmasıdır. scilimits ile oynadım ama boşuna.

Kene, sadece tek bir anlamlı figüre ve sıfırın üzerinde sıfırlamaya nasıl zorlayabilir ve gerektiğinde yüzebilir?

MWE aşağıda ekledi:

import matplotlib.pyplot as plt 
import numpy as np 

t = np.arange(0.0, 10000.0, 10.) 
s = np.sin(np.pi*t)*np.exp(-t*0.0001) 

fig, ax = plt.subplots() 

ax.tick_params(axis='both', which='major') 
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,3)) 
plt.plot(t,s) 

plt.show() 
+0

Kesilmiş ve kodlanabilir kod ekleyebilir misiniz? – atomh33ls

+1

http://stackoverflow.com/help/mcve – atomh33ls

+0

Özür dileriz şimdi – Astrid

cevap

1

ben bu sorunu koştu zaman keneler için özel bir FuncFormatter kullanmaktı ile ben gelebilir iyi. Ancak, ölçeği (örneğin, 1e5) ekseni ile birlikte görüntülemenin bir yolunu buldum. Kolay çözüm, elle işaretleme etiketi ile dahil edildi.

Maalesef bu tamamen soruya cevap vermez, ama benim çözüm böyle biraz görünüyor MWE olarak problem :)

için nispeten basit bir çözüm olarak yeterli olabilir eğer:

import matplotlib.pyplot as plt 
from matplotlib.ticker import FuncFormatter 
import numpy as np 


def tickformat(x): 
    if int(x) == float(x): 
     return str(int(x)) 
    else: 
     return str(x)   


t = np.arange(0.0, 10000.0, 10.) 
s = np.sin(np.pi*t)*np.exp(-t*0.0001) 

fig, ax = plt.subplots() 

ax.tick_params(axis='both', which='major') 
plt.plot(t,s) 

fmt = FuncFormatter(lambda x, pos: tickformat(x/1e3)) 
ax.xaxis.set_major_formatter(fmt) 

plt.xlabel('time ($s 10^3$)') 

plt.show() 

Not Bu örnek, x -aksiyi manipüle eder!

enter image description here

Tabii ki, bu verileri tekrar ölçekleme ile daha da basit elde edilebilir. Bununla birlikte, veriye dokunmak istemediğinizi ve sadece ekseni değiştireceğinizi varsayarım.

+0

Bunun için teşekkürler, güzel küçük bir çözüm. Bunu yapmak için iyi bir yolun olmadığı çok garip. – Astrid

+1

Katılıyorum, ama belki de gerçek matplotlib gurularından biri, daha sonra gelip basit ve pratik bir çözüm sunacak;) – kazemakase

+0

Tam olarak, biri ancak umabilir :) – Astrid

0

Bunu, ScalarFormatter üzerinde bulunan düğmeler aracılığıyla yapmak için açık bir yol görmüyorum. Böyle bir şey:

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.ticker as mticker 

t = np.arange(0.0, 10000.0, 10.) 
s = np.sin(np.pi*t)*np.exp(-t*0.0001) 

class EpiCycleScalarFormatter(mticker.ScalarFormatter): 
    def _set_orderOfMagnitude(self, rng): 
     # can just be super() in py3, args only needed in LPy 
     super(EpiCycleScalarFormatter, self)._set_orderOfMagnitude(rng) 
     if self.orderOfMagnitude != 0: 
      self.orderOfMagnitude -= 1 


fig, ax = plt.subplots() 

ax.tick_params(axis='both', which='major') 
ax.yaxis.set_major_formatter(EpiCycleScalarFormatter()) 
ax.xaxis.set_major_formatter(EpiCycleScalarFormatter()) 
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,3)) 
plt. 
plt.show()plot(t,s) 

enter image description here

sorununuzu çözecektir. Alt-sınıfın ismini not edin, çünkü bu sadece epicycles ekliyor (çalıştıklarına benziyorlar, fakat sadece daha fazla karmaşıklık ekliyorlar) mevcut koda ekliyorlar. Bu aynı zamanda kütüphanenin herhangi bir zamanda kırılabileceğimiz özel kısımlarına da dokunuyor.

İlgili konular