Onay etiketi metnini değiştirme


216

Bir arsada birkaç seçili onay etiketinde bazı değişiklikler yapmak istiyorum.

Örneğin, eğer:

label = axes.yaxis.get_major_ticks()[2].label
label.set_fontsize(size)
label.set_rotation('vertical')

kene etiketinin yazı tipi boyutu ve yönü değişir.

Ancak, şunu deneyin:

label.set_text('Foo')

Kene etiketi edilir değil güncellenmiştir. Ayrıca yaparsam:

print label.get_text()

hiçbir şey basılmaz.

İşte biraz daha gariplik. Bunu denediğimde:

 from pylab import *
 axes = figure().add_subplot(111)
 t = arange(0.0, 2.0, 0.01)
 s = sin(2*pi*t)
 axes.plot(t, s)
 for ticklabel in axes.get_xticklabels():
     print ticklabel.get_text()

Yalnızca boş dizeler yazdırılır, ancak grafikte '0.0', '0.5', '1.0', '1.5' ve '2.0' olarak etiketlenmiş keneler bulunur.


Etiketi almak için kullandığınız çizimi temin edebilir misiniz?
Claudio

Boş etiketler alıyorsunuz çünkü henüz tuvali çizmediniz. draw()Etiketleri yazdırmaya çalışmadan önce ararsanız , beklediğinizi elde edersiniz. Bireysel onay etiketlerini ayarlamak maalesef bir dokunuş daha zordur (olan şey, kene konumlandırıcı ve biçimlendiricinin sıfırlanmamış olması ve siz bunu yaptığınızda geçersiz kılmasıdır set_text). Birisi beni yenmezse biraz örnek ekleyeceğim. Yine de, otobüsü yakalamak zorundayım.
Joe Kington

@JoeKington: Harika! Düzeltmenizi görmek için sabırsızlanıyorum.
repoman

@repoman - Görünüşe göre çok erken bir dokunuş konuştum. Aklımda olan şey matplotlib'in eski sürümleri için çalışıyor, ancak en son sürüm için çalışmıyor. Biraz daha kazmaya ihtiyacım var. Söylendiği gibi, bu kadar karmaşık olmamalı ...
Joe Kington

Yanıtlar:


298

Uyarı: Ticklabels zaten bir dizeye ayarlanmadığı sürece (genellikle bir boxplot'ta olduğu gibi), bu, daha yeni bir matplotlib sürümüyle çalışmaz 1.1.0. Mevcut github ustasından çalışıyorsanız, bu işe yaramaz. Sorunun henüz ne olduğundan emin değilim ... İstenmeyen bir değişiklik olabilir ya da olmayabilir ...

Normalde, şu satırlar boyunca bir şeyler yaparsınız:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

# We need to draw the canvas, otherwise the labels won't be positioned and 
# won't have values yet.
fig.canvas.draw()

labels = [item.get_text() for item in ax.get_xticklabels()]
labels[1] = 'Testing'

ax.set_xticklabels(labels)

plt.show()

resim açıklamasını buraya girin

Bu kadar çok çembere atlamanızın nedenini anlamak için matplotlib'in nasıl yapılandırıldığını biraz daha anlamanız gerekir.

Matplotlib, açıkça belirtilmediği sürece, kene vb. Gibi "statik" konumlandırma yapmaktan kasıtlı olarak kaçınır. Varsayım, arsa ile etkileşime girmek isteyeceğinizdir ve böylece arsa, keneler, kene etiketleri vb. Sınırları dinamik olarak değişecektir.

Bu nedenle, belirli bir onay etiketinin metnini ayarlayamazsınız. Varsayılan olarak, çizim her çizildiğinde eksenin Konumlandırıcı ve Formatlayıcı tarafından yeniden ayarlanır.

Ancak, Konum Belirleyiciler ve Biçimlendiriciler statik ( FixedLocatorve FixedFormattersırasıyla) olarak ayarlanmışsa , onay etiketleri aynı kalır.

Bu set_*ticklabelsya da ax.*axis.set_ticklabelsöyle.

Umarım bu, bireysel bir kene etiketini değiştirmenin neden biraz kıvrımlı olduğuna dair açıkça daha net hale getirir.

Genellikle, aslında yapmak istediğiniz şey sadece belirli bir pozisyona açıklama eklemek. Bu durumda annotate, bunun yerine bakın.


10
bu, mevcut sürümle (1.20) çalışmıyor gibi görünüyor!
Andrew Jaffe

1
Ticklabels zaten bir boxplot gibi bir dize olarak ayarlanmışsa, bu hala çalışıyor. Bu açık olabilir, ancak cevabın ilk satırı daha yeni matplotlib sürümlerinde çalışmadığı için, kullanıcılar tamamen atlayabilir (başlangıçta yaptım). Belki kısaca bahsedelim.
joelostblom

2
Bence plt.gca ()
alexey

boldDiğerleri "hafif" fontweight kullanırken "test" fontweight olmak istiyorum . Bunu yapmanın bir yolu var mı?
steven

1
bir jupyter defterde kullananlar için bu fig.canvas.draw()önemli olduğunu belirterek yararlanabilir
wander95

96

Bunu ayrıca pylab ve xticks ile yapabilirsiniz

import matplotlib
import matplotlib.pyplot as plt
x = [0,1,2]
y = [90,40,65]
labels = ['high', 'low', 37337]
plt.plot(x,y, 'r')
plt.xticks(x, labels, rotation='vertical')
plt.show()

http://matplotlib.org/examples/ticks_and_spines/ticklabels_demo_rotation.html


Bu basit bir çözümdür ve pyplot 1.5.1 ile çalışır. Bu iptal edilmelidir.
wordsmith

Her ne kadar soru bunu sormasa da, bu örneğin kenelerin yerlerini değiştirerek aynı zamanda etiketlerini değiştirmenize izin verdiğini takdir ediyorum.
eclark

Modern matplotlib belgelerinden : "pylab kullanımdan kaldırılmıştır ve ad alanı kirliliği nedeniyle kullanımı kesinlikle önerilmez. Bunun yerine pyplot kullanın."
Nathaniel Jones

93

Yeni sürümlerinde matplotlib, kene etiketlerini bir grup strdeğerle ayarlamazsanız, bunlar ''varsayılan olarakdır (ve grafik çizildiğinde etiketler basitçe keneler değerleridir). Bunu bilerek, istediğiniz çıktıyı elde etmek için böyle bir şey gerekir:

>>> from pylab import *
>>> axes = figure().add_subplot(111)
>>> a=axes.get_xticks().tolist()
>>> a[1]='change'
>>> axes.set_xticklabels(a)
[<matplotlib.text.Text object at 0x539aa50>, <matplotlib.text.Text object at 0x53a0c90>, 
<matplotlib.text.Text object at 0x53a73d0>, <matplotlib.text.Text object at 0x53a7a50>, 
<matplotlib.text.Text object at 0x53aa110>, <matplotlib.text.Text object at 0x53aa790>]
>>> plt.show()

ve sonuç: resim açıklamasını buraya girin

ve şimdi kontrol ederseniz _xticklabels, artık bir grup değiller ''.

>>> [item.get_text() for item in axes.get_xticklabels()]
['0.0', 'change', '1.0', '1.5', '2.0']

1.1.1rc1Mevcut sürümden sürümlere kadar çalışır 2.0.


Teşekkürler, aradığım cevap bu. En temiz çözüm IMO; sadece set_xticklabelsdizeleri ve kene nesneleri karışık bir liste ile tedarik .
Luke Davis

Onay etiketleri ints olarak ayarlanırsa, bu etiketlerin kayan sayıya dönüşeceğini unutmayın. Kolayca çalıştı ama kayda değer.
ApproachingDarknessFish

Bu işe yaradı ( ax.get_xticks().tolist()). En çok oy alan çözüm ( ax.get_xtickslabels()). Her plt.show()ne fig.canvas.draw()kadar önerilen şekilde kullansam da, bir şekilde etiketleri çıkarılmadan önce ayıklayamadı .
CypherX

Modern matplotlib belgelerinden FYI : "Pylab kullanımdan kaldırıldı ve ad alanı kirliliği nedeniyle kullanımı kesinlikle önerilmez. Bunun yerine pyplot kullanın."
Nathaniel Jones

17

Bu sorunun sorulmasından bu yana bir süre geçti. Bugün itibariyle ( matplotlib 2.2.2) ve bazı okuma ve denemelerden sonra, en iyi / uygun yolun şu olduğunu düşünüyorum:

Matplotlib adlı bir modüle sahip tickerolduğu "destek tamamen yapılandırılabilir kene yerleştirme ve biçimlendirmeye sınıflarını içerir" . Arsadan belirli bir işareti değiştirmek için aşağıdakiler benim için çalışır:

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

def update_ticks(x, pos):
    if x == 0:
        return 'Mean'
    elif pos == 6:
        return 'pos is 6'
    else:
        return x

data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
ax.hist(data, bins=25, edgecolor='black')
ax.xaxis.set_major_formatter(mticker.FuncFormatter(update_ticks))
plt.show()

Normal dağılımdan rastgele değerlere sahip histogram

Uyarı! xkenenin değeri posve eksendeki sırayla göreli konumudur. İndeksleme sırasında her zamanki gibi değil, posbaşlayan değerleri alanlara dikkat edin .10


Benim durumumda, y-axisbir histogramı yüzde değerleriyle biçimlendirmeye çalışıyordum . mtickerdaha PercentFormatterönce olduğu gibi ayrı bir işlev tanımlamaya gerek kalmadan bunu kolayca yapabilen başka bir sınıfa sahiptir :

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

data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
weights = np.ones_like(data) / len(data)
ax.hist(data, bins=25, weights=weights, edgecolor='black')
ax.yaxis.set_major_formatter(mticker.PercentFormatter(xmax=1.0, decimals=1))
plt.show()

Normal dağılımdan rastgele değerlere sahip histogram

Bu durumda xmax,% 100'e karşılık gelen veri değeridir. Yüzdeler şu şekilde hesaplanır x / xmax * 100, bu yüzden düzeltiyoruz xmax=1.0. Ayrıca, decimalsnoktadan sonra yerleştirilecek ondalık basamak sayısıdır.


12

Axes sınıfı, onay etiketlerini ayarlamanıza olanak tanıyan bir set_yticklabels işlevine sahiptir:

#ax is the axes instance
group_labels = ['control', 'cold treatment',
             'hot treatment', 'another treatment',
             'the last one']

ax.set_xticklabels(group_labels)

Hâlâ yukarıdaki örneğin neden işe yaramadığı üzerinde çalışıyorum.


3
Ama sadece tek bir etiketi değiştirmek istiyorum. Yukarıdaki numara tüm onay etiketlerini çıkarmanızı ve istenen etiketi yeni bir değere ayarlamanızı gerektirir. Ancak label.get_text () hiçbir şey döndürmediğinde onay etiketlerini nasıl çıkarabilirim?
repoman

11

Bu çalışıyor:

import matplotlib.pyplot as plt

fig, ax1 = plt.subplots(1,1)

x1 = [0,1,2,3]
squad = ['Fultz','Embiid','Dario','Simmons']

ax1.set_xticks(x1)
ax1.set_xticklabels(squad, minor=False, rotation=45)

Sıkıntılar


7

Bu, matplotlib 3'te de çalışır:

x1 = [0,1,2,3]
squad = ['Fultz','Embiid','Dario','Simmons']

plt.xticks(x1, squad, rotation=45)

5

Birlikte çalışmazsanız figve axtüm etiketleri değiştirmek istiyorsanız (örn. Normalleştirme için) bunu yapabilirsiniz:

labels, locations = plt.yticks()
plt.yticks(labels, labels/max(labels))

1

Bunu dene :

  fig,axis = plt.subplots(nrows=1,ncols=1,figsize=(13,6),sharex=True)
  axis.set_xticklabels(['0', 'testing', '10000', '20000', '30000'],fontsize=22)

-4

yapabilirsin:

for k in ax.get_xmajorticklabels():
    if some-condition:
        k.set_color(any_colour_you_like)

draw()

Birisi bu cevabın neden bu kadar ağır indirildiğini açıklayabilir mi?
Hlynur Davíð Hlynsson

@ HlynurDavíðHlynsson Bence bu sorunun gerçekten bir ilgisi yok. Belki bazı düzenlemelerle ... Soruyla ilişkilendirirseniz, lütfen düzenleyin. ;)
loved.by.Jesus
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.