Matplotlib'de x ekseni ölçeğini değiştirin


95

Bu arsayı Matlab kullanarak oluşturdum

görüntü açıklamasını buraya girin

Matplotlib kullanarak, x eksenleri 100000, 200000, 300000 gibi büyük sayılar çizer. 1, 2, 3 ve 10 ^ 5 gibi bir şeyin gerçekten 100000, 200000, 300000 olduğunu belirtmek istiyorum.

Matplotlib'de böyle bir ölçek oluşturmanın basit bir yolu var mı?

Yanıtlar:


148

Şunları kullanmayı deneyin matplotlib.pyplot.ticklabel_format:

import matplotlib.pyplot as plt
...
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))

Bu a x 10^b, x ekseni onay işaretlerinize bilimsel gösterimi (yani ) uygular


9
ofset eklemek mümkün mü? (ör. 0.0, 0.5, 1.0, 1.5, ... ve x 10 ^ b yerine 0, 5, 10, 15, ... ve x 10 ^ {b-1} olacaktır)
Eagle

24
ticklabel_formataynı zamanda eksen nesneleri için bir yöntemdir, benzer bir şey deneyebilirsinizax.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
Covich

Örneğin 2 parselden oluşan bir alt grafiğiniz varsa, bu nasıl işleyebilir?
FaCoffee

2
@Eagle üzgünüm, bir ofset eklemeyle ilgili sonraki sorunuz, bahsettiğim şeydi. x eksenim [0.1, 0.2, ...]ve [1, 2, ...]ayarlanmış bir üs kullanmayı tercih ederim . bunun için bir çözüm bulabildin mi?
trianta2

@Eagle Ben de trianta2'nin bahsettiği soruyla ilgileniyorum
Ben Usman

15

Bu, orijinal sorunuza, sorunuzun gövdesindeki sorgulardan birine verilen bir cevap değildir.

Küçük bir önsöz, böylece benim adım garip görünmesin:

import matplotlib
from matplotlib import rc
from matplotlib.figure import Figure
ax = self.figure.add_subplot( 111 )

Bahsedildiği gibi matplotlib'in büyük veya küçük değerler için bilimsel gösterimi kullanması gerektiğini belirtmek için ticklabel_format'ı kullanabilirsiniz:

ax.ticklabel_format(style='sci',scilimits=(-3,4),axis='both')

Bunun görüntülenme şeklini rcParams'daki bayrakları kullanarak (matplotlib import rcParams'tan) veya doğrudan ayarlayarak etkileyebilirsiniz. '1e' ve 'x10 ^' bilimsel gösterimi arasında geçiş yapmanın şu kadar zarif bir yolunu bulamadım:

ax.xaxis.major.formatter._useMathText = True

Bu size daha fazla Matlab-esc ve gerçekten de tartışmasız daha iyi bir görünüm vermelidir. Bence aşağıdakiler de aynı şeyi yapmalı:

rc('text', usetex=True)

11

Skaler biçimlendirici destekleri üslerin toplama. Dokümanlar aşağıdaki gibidir:

sınıf matplotlib.ticker.ScalarFormatter (useOffset = True, useMathText = False, useLocale = None) Tabanlar: matplotlib.ticker.Formatter

Onay konumu eski bir sayıdır. UseOffset == True ise ve veri aralığı veri ortalamasından çok daha küçükse, onay etiketlerinin anlamlı olacağı şekilde bir ofset belirlenecektir. <10 ^ -n veya veri> = 10 ^ m verileri için bilimsel gösterim kullanılır; burada n ve m, set_powerlimits ((n, m)) kullanılarak ayarlanan güç limitleridir. Bunların varsayılanları axes.formatter.limits rc parametresi tarafından kontrol edilir.

tekniğiniz şöyle olacaktır:

from matplotlib.ticker import ScalarFormatter
xfmt = ScalarFormatter()
xfmt.set_powerlimits((-3,3))  # Or whatever your limits are . . .
{{ Make your plot }}
gca().xaxis.set_major_formatter(xfmt)

x10^5Biçimde görüntülenen üs elde etmek için, ScalarFormatter ile somutlaştırın useMathText=True.

Görüntüden Sonra

Ayrıca şunları da kullanabilirsiniz:

xfmt.set_useOffset(10000)

Bunun gibi bir sonuç almak için:

görüntü açıklamasını buraya girin


3
ScalarFormatter'ı useMathText=Truealmak için örnekleyin x10^4.
Hoffmann

9

Basit çözümü buluyorum

pylab.ticklabel_format(axis='y',style='sci',scilimits=(1,4))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.