arsa kenelerinin azaltılması


161

Grafiğimde çok fazla keneler var ve birbirlerine koşuyorlar.

Kenelerin sayısını nasıl azaltabilirim?

Örneğin, kenelerim var:

1E-6, 1E-5, 1E-4, ... 1E6, 1E7

Ve sadece şunu istiyorum:

1E-5, 1E-3, ... 1E5, 1E7

İle oynamaya çalıştım LogLocator, ama bunu anlayamadım.

Yanıtlar:


266

Alternatif olarak, matplotlib'in onları konumlandırmasına izin verirken (şu anda yalnızca ile MaxNLocator) kenelerin sayısını ayarlamak istiyorsanız pyplot.locator_params,

pyplot.locator_params(nbins=4)

Bu yöntemde aşağıda belirtildiği gibi belirli bir eksen belirtebilirsiniz, varsayılan değer her ikisidir:

# To specify the number of ticks on both or any single axes
pyplot.locator_params(axis='y', nbins=6)
pyplot.locator_params(axis='x', nbins=10)

27
Bu harika bir öneriydi, aynı zamanda süreci gerçekten kolay hale getirebildiğini pyplot.locator_params(axis = 'x', nbins = 4)(veya axis = 'y') belirleyebildi . Teşekkürler @bgamari!
benjaminmgross

8
Günlük ölçeği ile, numticksbunun yerine çalıştınbins
meduz

1
@bgamari, @meduz'un numticksişaret ettiği gibi logaritmik araziler için çözüm ekleyebilir misiniz?
Løiten

7
Bu, etiketleri olması gerektiği yere yerleştirmiyor gibi görünüyor. Örneğin, orijinal kene etiketleri [0, 1, ..., 99]ve şimdi bir set ise nticks=10, yeni seyrek etiketler eksen boyunca on kat daha uzağa yerleştirilecektir, yani şimdi 1nerede 9, 2nerede 19... ve 9nerede olacak 99.
Vim

2
Bu yönteme güvenmeden önce sonuçlarınızı kontrol edin. @Vim doğru. Onay değerleri yanlış yerleştirilecektir.
David J.

55

Birisi hala bu sayfayı arama sonuçlarında alıyorsa:

fig, ax = plt.subplots()

plt.plot(...)

every_nth = 4
for n, label in enumerate(ax.xaxis.get_ticklabels()):
    if n % every_nth != 0:
        label.set_visible(False)

7
Bu aslında hiçbir şey yapmayan diğer tüm cevaplara karşı çalıştı. teşekkürler :)
faizan

Aferin. Bunu bulmam biraz zaman aldı ama istediğimi yaptı.
John

Teşekkürler, bu, kalan etiketlerin doğru konumda olmasını sağlar. Bu yanıtı geliştirecek ek bir adım da onay işaretini kaldırmaktır.
David J.

Büyük basit cevap - SO topluluğu tarafından bilinen hiçbir özel yöntem şaşırtmadı. Bu lib için değerli bir katkı olabilir mi?
jabberwocky

32

Kenelerin özelleştirilmesi ve görünümü sorununu çözmek için matplotlib web sitesinde Kene Bulucu kılavuzuna bakın

ax.xaxis.set_major_locator(plt.MaxNLocator(3))

X eksenindeki toplam kenelerin sayısını 3'e ayarlar ve eşit olarak eksen boyunca dağıtır.

Bununla ilgili güzel bir öğretici de var


Yalnızca ilk 3 datetime dizinini seçin. panda.DataFrame.plot'tan baltayı aldığınızdaax = df.plot()
Mithril

@ Mitril üzgünüm yorumunuzu tam olarak anlamıyorum. Lütfen biraz açıklayabilir misiniz?
Prageeth Jayathissa

Tarih saat pandas.DataFrameendeksiyle [2019-01-01, ... 2019-11-01] bir df ( ) varsa , çağırın ax = df.plot(), bir şekil nesnesi döndürün . call ax.xaxis.set_major_locator(plt.MaxNLocator(3)) ilk 3 indeksini [2019/01/01, 2019/01/02, 2019/01/03] göstermek sadece.
Mithril

1
@ Mitril, df.plot()genellikle görüntüler minor_locator, bu yüzden denemek isteyebilirsiniz ax1.xaxis.set_minor_locator(plt.MaxNLocator(3)). Ayrıca 3görüntülemek istediğiniz kenelerin sayısını da değiştirmeyi unutmayın . Pandalar için tavsiye ederim import matplotlib.dates as mdatesve koşmak ax.xaxis.set_minor_locator(mdates.MonthLocator(interval = 1))içinax.xaxis.set_minor_formatter(mdates.DateFormatter('%m-%Y'))
Prageeth Jayathissa

20

set_ticks()Eksen nesneleri için bir işlev vardır .


4
Hangi keneleri istediğimi önceden bilseydim bu işe yarardı. Yukarıda verdiğim örnek sadece bir örnektir. Kenelerin ne olduğunu bilmiyorum, sadece daha azını istediğimi biliyorum, yani her biri.
jlconlin

10
Axes nesnesini arayabilir get_xticks()veya get_yticks()ilk olarak arayabilir , gerektiği gibi düzenleyebilir ve ardından listeyi geri gönderebilirsiniz set_ticks().
user812786

4
Benim yok set_ticks(), ama ben set_xticks()ve set_yticks(). Bunlar, eksen değil, eksen nesnelerinin nitelikleridir. Belki de bu son birkaç yılda değişti.
Gauthier

2
Yapmam gerekip gerekmediğinden emin değilim, bazı insanlar cevabınızı olduğu gibi yararlı buldular ve sadece benim için farklı olduğu herkes için olduğu anlamına gelmiyor.
Gauthier

1
Bir örnek, bu cevabı faydalı kılmak için uzun bir yol kat edecektir.
Richard

10

birisinin buna hala ihtiyacı varsa ve burada hiçbir şey benim için gerçekten işe yaramadığı için, kenelerin sayısını tam olarak N'ye sabitlerken, oluşturulan arsa görünümünü "olduğu gibi" tutan çok basit bir yol buldum:

import numpy as np
import matplotlib.pyplot as plt

f, ax = plt.subplots()
ax.plot(range(100))

ymin, ymax = ax.get_ylim()
ax.set_yticks(np.round(np.linspace(ymin, ymax, N), 2))

2
Float yerine int değerlerini döndürmek için son satırı biraz değiştirmek zorunda kaldım:ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
Nick Settje

@ NickSettje hala benimle yüzüyor!
Mohd

4

@Raphael'in verdiği çözüm basit ve oldukça faydalı.

Yine de, görüntülenen onay etiketleri orijinal dağıtımdan değil, döndürülen dizinin dizinlerinden örneklenen değerler olacaktır np.linspace(ymin, ymax, N).

Orijinal onay etiketlerinizden eşit aralıklarla yerleştirilmiş N değerlerini görüntülemek için set_yticklabels()yöntemi kullanın . İşte y ekseni için tamsayı etiketli bir snippet:

import numpy as np
import matplotlib.pyplot as plt

ax = plt.gca()

ymin, ymax = ax.get_ylim()
custom_ticks = np.linspace(ymin, ymax, N, dtype=int)
ax.set_yticks(custom_ticks)
ax.set_yticklabels(custom_ticks)

Bu güzel tweak için Kudos!
Mohd

2

Bir günlük ölçeği kullanıldığında, ana kenelerin sayısı aşağıdaki komutla sabitlenebilir

import matplotlib.pyplot as plt

....

plt.locator_params(numticks=12)
plt.show()

Ayarlanacak değer numticks, görüntülenecek eksen kenesi sayısını belirler.

@ Bgamari'nin gönderisine locator_params()işlevi tanıttığı için krediler , ancak nticksbir günlük ölçeği kullanıldığında parametre bir hata atar.


Soru ve cevap önceki matplotlib, yani 1 içindir ve 2'ye atıfta bulunuyorsunuz.
Dawid Laszuk
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.