Matplotlib'de x veya y eksenindeki “tik sıklığı” değiştiriliyor mu?


477

Python'un verilerimi nasıl çizdiğini düzeltmeye çalışıyorum.

Söyle

x = [0,5,9,10,15]

ve

y = [0,1,2,3,4]

Sonra yapardım:

matplotlib.pyplot.plot(x,y)
matplotlib.pyplot.show()

ve x ekseni keneleri 5 aralıklarla çizilir. 1 aralığını göstermenin bir yolu var mı?


6
Keneler burada uygun kelime olmasına rağmen, keneleri adım boyutuna değiştirmek kesinlikle bu soruya daha fazla yeniyi yönlendirecektir.
Sibbs Kumar

9
Yakından ilgili soru: stackoverflow.com/questions/6682784/… ve harika bir çözüm:pyplot.locator_params(nbins=4)
Dr.Jan-Philip Gehrcke

nbins, ne yazık ki matplotlib2.x'te kullanımdan kaldırılmış gibi görünüyor
jeremy_rutman

Yanıtlar:


583

İşaretleri işaretlemek istediğiniz yeri açıkça belirleyebilirsiniz plt.xticks:

plt.xticks(np.arange(min(x), max(x)+1, 1.0))

Örneğin,

import numpy as np
import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(np.arange(min(x), max(x)+1, 1.0))
plt.show()

( np.arangePython'un yerine kullanılmıştır rangeihtimale fonksiyonu min(x)ve max(x)olan ints yerine yüzer.)


plt.plot(Veya ax.plot) işlevi otomatik varsayılan ayarlar xve ysınırlarını. Bu limitleri korumak ve onay işaretlerinin adım ax.get_xlim()boyutunu değiştirmek istiyorsanız, Matplotlib'in önceden hangi sınırları ayarladığını bulmak için kullanabilirsiniz.

start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, stepsize))

Varsayılan kene biçimlendirici, kene değerlerini anlamlı sayıda anlamlı basamağa yuvarlayan iyi bir iş yapmalıdır. Ancak, biçim üzerinde daha fazla denetime sahip olmak istiyorsanız, kendi biçimlendiricinizi tanımlayabilirsiniz. Örneğin,

ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))

İşte çalıştırılabilir bir örnek:

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

x = [0,5,9,10,15]
y = [0,1,2,3,4]
fig, ax = plt.subplots()
ax.plot(x,y)
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, 0.712123))
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))
plt.show()

72
Hala kendi sınırlarına karar vermenin bir yolu yok, ama sadece adım boyutunu değiştirin? Min 3523.232512 gibi bir şeyse bu yöntem çok iyi değildir!
Korone

3
@Corone, Sizden bu yana bir süre geçti, ancak yine de otomatik sınır belirleme kullanırken adım boyutunun kolay kontrolüne izin veren bir cevap gönderdim.
jthomas

3
O Not +1içinde plt.xticks(np.arange(min(x), max(x)+1, 1.0))geçen kene işareti göstermek için gereklidir.
Alex Willison

1
Evet, yarı açık aralıkta dahil, ancak hariç np.arange(start, stop)değerler oluşturur . Bu yüzden dahil edildiğinden emin olurdum . [start, stop)startstopmax(x)+1max(x)
unutbu

4
datetime için bir eşdeğer var plt.xticks(np.arange(min(dates), max(dates)+0.1,0.1)mı? sadece yılı çiziyor gibi görünüyor
WBM

207

Başka bir yaklaşım, eksen bulucuyu ayarlamaktır:

import matplotlib.ticker as plticker

loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)

İhtiyaçlarınıza bağlı olarak birkaç farklı konum belirleyici vardır.

İşte tam bir örnek:

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

x = [0,5,9,10,15]
y = [0,1,2,3,4]
fig, ax = plt.subplots()
ax.plot(x,y)
loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)
plt.show()

7
Bu beklendiği gibi çalışmıyor. Özellikle, tarihleri ​​kullanırken, uygun tarihleri ​​kullanmaz.
Chris Fonnesbeck

35
Tarihleri ​​kullanırken matplotlib.dates modülündeki yöntemleri kullanmalısınız. Örneğinmatplotlib.dates.AutoDateLocator()
robochat

3
Tarihler ile benim için beklendiği gibi çalıştı. Bu çözüm kabul edilenden çok daha kolay.
Pablo Suau

base=1.0Aslında ne demek / yapmak?
javadba

base = 1.0, her tam sayı için bir konum belirleyici olacağı anlamına gelir. Dokümantasyon, Çoklu-Temsilcinin "Görüntüleme aralığı dahilinde bir tabanın her tamsayı katına bir onay işareti koyduğunu" belirtir. Eğer base = 2 ise, o zaman çift sayılar için bir kene olacak ve base = 2.5 olayı koyabileceğinizi düşünüyorum.
robochat

124

Bu çözümü beğendim ( Matplotlib Çizim Kitabı'ndan ):

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

x = [0,5,9,10,15]
y = [0,1,2,3,4]

tick_spacing = 1

fig, ax = plt.subplots(1,1)
ax.plot(x,y)
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
plt.show()

Bu çözüm ticker.MultipleLocater(), verilen sayı üzerinden kene aralığının açıkça kontrol edilmesini sağlar, otomatik limit belirlemesine izin verir ve daha sonra kolayca okunabilir.


3
Keneleri açıkça hesaplamadan bunu yapmanın bir yolu!
Zelphir Kaltstahl

4
Bu aynı cevaptır bu bir . İki yıl sonra özdeş bir cevap eklemek mantıklı değil.
ImportanceOfBeingErnest

6
İyi yakalama. Cevabı gönderdiğimde onları aynı şekilde tanımadım. Yine de, bu sunumun anlaşılması biraz daha kolay olduğunu düşünüyorum.
jthomas

Bu cevaptaki kitap referansı ayrıca daha fazla bilgi için yararlı bir kaynak sağlar.
Steven C. Howell

1
Bu, üç yıl önce gelen robochat ile aynı cevaptır.
MERose

90

Herkesin genel bir tek astarla ilgilenmesi durumunda, mevcut keneleri alın ve diğer keneleri örnekleyerek yeni keneleri ayarlamak için kullanın.

ax.set_xticks(ax.get_xticks()[::2])

3
Bu, farklı kene türleri (str, float, datetime) için tek genelleştirilebilir cevaptır
Ryszard Cetnarski

2
Tamsayı olmayan keneleri kaldırın: ax.set_xticks([tick for tick in ax.get_xticks() if tick % 1 == 0])
user2839288

Yukarıda ayrıntılı çözümler bir sürü ama en özlü olduğunu kabul ediyorum. Hatta ax.get_xticks () uzunluğunu ayıklayabilir ve dilimleme sıklığını bu uzunluğa göre gerekli kenelerin sayısına bölebilirsiniz.
Iain D

Bence bu en iyi cevap. Diğer cevapların çoğu çok karmaşıktır ve uygulanması / genelleştirilmesi zordur. Teşekkür ederim!
Seankala

2
Sadece çubuk sayısını azaltabilirken, soruda (ve benim hedefim nasıl bulduğumda) arttırmaktı.
Alexei Martianov

36

Bu biraz acayip, ama bunu yapmak için bulduğum en açık / kolay anlaşılır örnek. Burada SO'ya verilen bir cevaptan:

Matplotlib colorbar'da her nci onay etiketini gizlemenin en temiz yolu?

for label in ax.get_xticklabels()[::2]:
    label.set_visible(False)

Ardından, istediğiniz yoğunluğa bağlı olarak görünür veya ayarlanmamış olarak etiketlerin üzerinde döngü yapabilirsiniz.

edit: not bazen matplotlib etiketleri == ayarlar '', bu yüzden bir etiket mevcut gibi görünebilir, aslında ve sadece bir şey göstermiyor. Gerçek görünür etiketler arasında geçiş yaptığınızdan emin olmak için şunları deneyebilirsiniz:

visible_labels = [lab for lab in ax.get_xticklabels() if lab.get_visible() is True and lab.get_text() != '']
plt.setp(visible_labels[::2], visible=False)

3
Bu en basit ve genel çözümdür. Küçük bir ayar: genellikle ax.get_xticklabels()[1::2]gizlenecek etiketlerdir.
jolvi

Bu matplotlib.finance.candlestick2
BCR

@BCR, xticklabell'lerin bazılarının yalnızca şu şekilde ayarlanmış olması nedeniyle, bunlar arasında ''döngü yaptığınızda, boş görünmez olan (görselleştirme üzerinde hiçbir etkisi olmayacak, ancak çekmediğiniz anlamına gelebilir) xticklabels yapıyor olabilirsiniz. doğru etiketler). vis_labels = [label for label in ax.get_xticklabels() if label.get_visible() is True]; plt.setp(vis_labels[::2], visible==False)
Şunu

15

Bu eski bir konudur, ama arada sırada bununla karşılaşıyorum ve bu işlevi yaptım. Çok uygun:

import matplotlib.pyplot as pp
import numpy as np

def resadjust(ax, xres=None, yres=None):
    """
    Send in an axis and I fix the resolution as desired.
    """

    if xres:
        start, stop = ax.get_xlim()
        ticks = np.arange(start, stop + xres, xres)
        ax.set_xticks(ticks)
    if yres:
        start, stop = ax.get_ylim()
        ticks = np.arange(start, stop + yres, yres)
        ax.set_yticks(ticks)

Kenelerin bu şekilde kontrol edilmesinin bir uyarısı, eklenen bir çizgiden sonra maksimum ölçeğin interaktif otomajik güncellemesinden artık zevk almamasıdır. Sonra yap

gca().set_ylim(top=new_top) # for example

ve yeniden ayarlama işlevini yeniden çalıştırın.


11

Uygun olmayan bir çözüm geliştirdim. X eksenine ve X'deki her nokta için bir etiket listesine sahip olduğumuzu düşünün.

Misal:
import matplotlib.pyplot as plt

x = [0,1,2,3,4,5]
y = [10,20,15,18,7,19]
xlabels = ['jan','feb','mar','apr','may','jun']
Diyelim ki sadece 'feb' ve 'jun' için keneler etiketleri göstermek istiyorum
xlabelsnew = []
for i in xlabels:
    if i not in ['feb','jun']:
        i = ' '
        xlabelsnew.append(i)
    else:
        xlabelsnew.append(i)
Güzel, şimdi sahte bir etiket listemiz var. İlk olarak, orijinal sürümü çizdik.
plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabels,rotation=45)
plt.show()
Şimdi, değiştirilmiş sürüm.
plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabelsnew,rotation=45)
plt.show()

6

aralığı sadece minimum kaynatma plakasına sahip basit bir astar ayarlamak istiyorsanız:

plt.gca().xaxis.set_major_locator(plt.MultipleLocator(1))

ayrıca küçük keneler için de kolayca çalışır:

plt.gca().xaxis.set_minor_locator(plt.MultipleLocator(1))

biraz ağız dolusu, ama oldukça kompakt


2
xmarks=[i for i in range(1,length+1,1)]

plt.xticks(xmarks)

Bu benim için çalıştı

[1,5] (1 ile 5 dahil) arasında keneler istiyorsanız, değiştirin

length = 5

1
Sadece yazabilirsin xmarks = range(1, length+1, 1). liste kavrayışının gereksiz olduğundan emin olabilirsiniz.
Neal

2

Saf Python Uygulaması

Aşağıda, pozitif, negatif veya karışık değerlere sahip herhangi bir sayısal seriyi (int veya float) işleyen ve kullanıcının istenen adım boyutunu belirlemesine izin veren istenen işlevselliğin saf bir python uygulaması aşağıdadır:

import math

def computeTicks (x, step = 5):
    """
    Computes domain with given step encompassing series x
    @ params
    x    - Required - A list-like object of integers or floats
    step - Optional - Tick frequency
    """
    xMax, xMin = math.ceil(max(x)), math.floor(min(x))
    dMax, dMin = xMax + abs((xMax % step) - step) + (step if (xMax % step != 0) else 0), xMin - abs((xMin % step))
    return range(dMin, dMax, step)

Örnek Çıktı

# Negative to Positive
series = [-2, 18, 24, 29, 43]
print(list(computeTicks(series)))

[-5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45]

# Negative to 0
series = [-30, -14, -10, -9, -3, 0]
print(list(computeTicks(series)))

[-30, -25, -20, -15, -10, -5, 0]

# 0 to Positive
series = [19, 23, 24, 27]
print(list(computeTicks(series)))

[15, 20, 25, 30]

# Floats
series = [1.8, 12.0, 21.2]
print(list(computeTicks(series)))

[0, 5, 10, 15, 20, 25]

# Step – 100
series = [118.3, 293.2, 768.1]
print(list(computeTicks(series, step = 100)))

[100, 200, 300, 400, 500, 600, 700, 800]

Örnek Kullanımı

import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(computeTicks(x))
plt.show()

Örnek kullanım grafiği

X ekseni, 5 ile eşit aralıklı tamsayı değerlerine sahipken, y ekseni farklı bir aralığa sahiptir ( matplotlibvarsayılan davranış, keneler belirtilmediğinden).

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.