2013-06-18 9 views
8

keneler. Yani bu, anlamına gelir, tüm eksen için etiketlerinin gösterilmemiştir.Matplotlib: minor için gösteri etiketleri Ben bir eksende bir <code>log</code> ölçeği kullandığınızda, o eksen <strong>hiçbir önemli kene</strong>,</strong><strong>sadece küçük olanları sahip olacağını ortaya çıkabilir, <code>matplotlib</code> ayrıca

Etiketlerde küçük keneler için de etiketlere ihtiyacım olduğunu nasıl belirleyebilirim?

plt.setp(ax.get_xticklabels(minor=True), visible=True) 

... ama hile yapmadım:

denedim.

+0

asla (bu benim matplotlibrc yılında text.usetex:False kullanarak nedenini olabilir) benim yakın oy, soruyu büyük ölçüde yanlış oku. Grafiğinizde büyük kütükleriniz yoksa, büyük olasılıkla bir günlük ölçeği kullanmamalısınız. – tacaswell

+2

@tcaswell bu doğru değil: Eğer güç kanununa yakın bir işleviniz varsa (muhtemelen küçük bir özellik ile), küçük aralıklarla da bir günlük ölçeği kullanmak istersiniz. Sonra bir kütük arsada, büyük kene 10'luk güçtedir, böylece bir menzile sahip olabilirsiniz [2000, 9000] ve büyük bir kene yok –

+1

Bu benim düşündüğüm buydu. 10 değerindeki herhangi bir güce yakın olmayan bir değerin etrafında yoğunlaşan (çok az dağınık) ve hala X eksenine bir günlük ölçeği uygulamak isteyen binlerce noktaya sahip olabilirim. –

cevap

5

. Eğer kene değerinin günlüğünü göstererek iyiysen matplotlib.ticker.LogFormatterExponent'u kullanabilirsiniz. matplotlib.ticker.LogFormatter'u denediğimi hatırlıyorum ama pek hoşlanmadım: eğer iyi hatırlarsam base^exp (0.1, 0, 1) 'e kadar her şeyi koyar. Her iki durumda da (diğer tüm matplotlib.ticker.LogFormatter* gibi) küçük keneler almak için labelOnlyBase=False'u ayarlamanız gerekir.

Özel bir işlev oluşturmayı bitirdim ve matplotlib.ticker.FuncFormatter'u kullanın. Benim yaklaşımım, kenelerin tamsayı değerlerinde olduğunu ve bir temel 10 günlüğü istediğini varsayar. Eğer büyük keneler kaldırmak ve büyük ve küçük kene yazı tipi boyutunu farklıdır subs = [2.0, 3.0, 6.0] kullanmazsanız

from matplotlib import ticker 
import numpy as np 

def ticks_format(value, index): 
    """ 
    get the value and returns the value as: 
     integer: [0,99] 
     1 digit float: [0.1, 0.99] 
     n*10^m: otherwise 
    To have all the number of the same size they are all returned as latex strings 
    """ 
    exp = np.floor(np.log10(value)) 
    base = value/10**exp 
    if exp == 0 or exp == 1: 
     return '${0:d}$'.format(int(value)) 
    if exp == -1: 
     return '${0:.1f}$'.format(value) 
    else: 
     return '${0:d}\\times10^{{{1:d}}}$'.format(int(base), int(exp)) 

subs = [1.0, 2.0, 3.0, 6.0] # ticks to show per decade 
ax.xaxis.set_minor_locator(ticker.LogLocator(subs=subs)) #set the ticks position 
ax.xaxis.set_major_formatter(ticker.NullFormatter()) # remove the major ticks 
ax.xaxis.set_minor_formatter(ticker.FuncFormatter(ticks_format)) #add the custom ticks 
#same for ax.yaxis 

sakıncası

+2

Bu işlev logaritmik onay işareti etiketleri için iyi biçimlendirme almak için parlak bir yaklaşım! Harika mesaj! –

11

Sen tekabül ekseninde set_minor_tickformatter kullanabilirsiniz: Ben log grafikleri düzgün çalışan keneler minör almak için birçok yol denedim

from matplotlib import pyplot as plt 
from matplotlib.ticker import FormatStrFormatter 

axes = plt.subplot(111) 
axes.loglog([3,4,7], [2,3,4]) 
axes.xaxis.set_minor_formatter(FormatStrFormatter("%.2f")) 
plt.xlim(1.8, 9.2) 
plt.show() 

enter image description here

İlgili konular