Python matplotlib'de eksen metnini döndürme


313

X Eksenindeki metnin nasıl döndürüleceğini anlayamıyorum. Bu bir zaman damgası, örnek sayısı arttıkça üst üste gelene kadar daha da yakınlaşıyorlar. Metni 90 derece döndürmek istiyorum, böylece örnekler birbirine yaklaştıkça üst üste gelmiyorlar.

Aşağıda sahip olduğum şey, X ekseni metninin nasıl döndürüleceğini anlayamama dışında iyi çalışıyor.

import sys

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import datetime

font = {'family' : 'normal',
        'weight' : 'bold',
        'size'   : 8}

matplotlib.rc('font', **font)

values = open('stats.csv', 'r').readlines()

time = [datetime.datetime.fromtimestamp(float(i.split(',')[0].strip())) for i in values[1:]]
delay = [float(i.split(',')[1].strip()) for i in values[1:]]

plt.plot(time, delay)
plt.grid(b='on')

plt.savefig('test.png')

3
Döndürülmüş etiketleri (yatay hizalama) ile hizalama hakkında önemli şeyler için bu cevaba bakınha
LondonRob

Yanıtlar:


511

Bu benim için çalışıyor:

plt.xticks(rotation=90)

8
Başka biri mpld3 kullanıyorsa ve bu çözümlerin hiçbiri işe yaramıyorsa. Rotasyon edilir değil mpld3 içinde destekledi.
beetree

4
Bunların şekil / pencere içinde kalması için ekstra noktalar. Benimki yarı dışarıda.
Gauthier

1
Bunu çizdikten sonra arayın . İlk Yani, ax.plot(...)o zamanplt.xticks(rotation=90)
CGFoX

161

Kolay yol

Burada açıklandığı gibi , matplotlib.pyplot figuresınıfta tarihleri ​​sizin için otomatik olarak uygun şekilde döndüren mevcut bir yöntem vardır .

Verilerinizi çizdikten sonra arayabilirsiniz (ör ax.plot(dates,ydata):

fig.autofmt_xdate()

Etiketleri daha fazla biçimlendirmeniz gerekiyorsa yukarıdaki bağlantıyı kontrol edin.

Tarihsel olmayan nesneler

Gereğince languitar 'ın yorum, ben önerdiği yöntem olmayan tarih saat xticksvs, yakınlaştırma zaman bir değilse düzgün güncelleme olmaz datetimesenin x ekseni veri olarak kullanılan nesne takip etmeli, Tommy cevabını' :

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

3
Bu en iyi yoldur, çünkü özlü, mevcut otomatik olarak oluşturulan keneler üzerinde çalışır ve çizim kenar boşluklarını okunabilir olacak şekilde ayarlar. Diğer yöntemler, kenelerin sayfadan çıkmasına izin verir ve ayarlamak için daha fazla işlem gerektirir (plt.tight_layouts () gibi).
EL_DON

Bir konum belirleyici ve biçimlendirici kullandıysanız, "other" yöntemi daha sonra uygulanırsa etkilerini bozabilir.
languitar

73

Burada birçok "doğru" yanıt var, ancak bazı ayrıntıların birkaçının dışında kaldığını düşündüğüm için bir tane daha ekleyeceğim. OP 90 derece dönüş istedi ancak 45 dereceye döneceğim çünkü sıfır veya 90 olmayan bir açı kullandığınızda yatay hizalamayı da değiştirmelisiniz; aksi takdirde etiketleriniz merkez dışında ve biraz yanıltıcı olacaktır (ve buraya gelen birçok insanın eksenleri 90'dan başka bir şeye döndürmek istediğini tahmin ediyorum).

En Kolay / En Az Kod

seçenek 1

plt.xticks(rotation=45, ha='right')

Daha önce de belirtildiği gibi, Nesneye Dayalı yaklaşımı tercih ederseniz bu istenmeyebilir.

seçenek 2

Başka bir hızlı yol (tarih nesneleri için tasarlanmıştır, ancak herhangi bir etiket üzerinde çalışıyor gibi görünüyor; bunun için önerilen şüphe var):

fig.autofmt_xdate(rotation=45)

fig genellikle aşağıdakilerden alırsınız:

  • fig = plt.figure()
  • fig, ax = plt.subplots()
  • fig = ax.figure

Nesneye Yönelik / Doğrudan ax

Seçenek 3a

Etiket listeniz varsa:

labels = ['One', 'Two', 'Three']
ax.set_xticklabels(labels, rotation=45, ha='right')

Seçenek 3b

Geçerli grafikten etiket listesini almak istiyorsanız:

# Unfortunately you need to draw your figure first to assign the labels,
# otherwise get_xticklabels() will return empty strings.
plt.draw()
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right')

Seçenek 4

Yukarıdakine benzer, ancak bunun yerine manuel olarak döngü yapın.

for label in ax.get_xticklabels():
  label.set_rotation(45)
  label.set_ha('right')

Seçenek 5

Burada hala pyplot(as plt) kullanıyoruz ancak nesne yönelimli çünkü belirli bir axnesnenin özelliğini değiştiriyoruz .

plt.setp(ax.get_xticklabels(), rotation=45, ha='right')

Seçenek 6

Bu seçenek basittir, ancak AFAIK, etiket yatay hizalamasını bu şekilde ayarlayamazsınız, böylece açınız 90 değilse başka bir seçenek daha iyi olabilir.

ax.tick_params(axis='x', labelrotation=45)

Düzenleme: Bu tam "hata" ile ilgili bir tartışma var ve bir düzeltme potansiyel olarak aşağıdakiler için planlanmıştır v3.2.0: https://github.com/matplotlib/matplotlib/issues/13774


65

Pyplot.setp dosyasını deneyin. Bence böyle bir şey yapabilirsiniz:

x = range(len(time))
plt.xticks(x,  time)
locs, labels = plt.xticks()
plt.setp(labels, rotation=90)
plt.plot(x, delay)

2
Traceback (most recent call last): File "plotter.py", line 23, in <module> plt.setp(time, rotation=90) File "/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py", line 183, in setp ret = _setp(*args, **kwargs) File "/usr/lib64/python2.7/site-packages/matplotlib/artist.py", line 1199, in setp func = getattr(o, funcName) AttributeError: 'datetime.datetime' object has no attribute 'set_rotation'
tMC

Sanırım bir adımı daha önce kaçırdım. Düzenlenen örnek yardımcı oluyor mu? Ben bir matplotlib uzmanı olmaktan uzak, daha iyi bir yol olabilir.
opiethehokie

1
Bu hiç işe yaramadı- Görüntü (makinemde) tamamen dağınık. çıktı görüntüsünün her tarafında siyah çizgiler var ... Neredeyse bir barkod gibi görünüyor. çok tuhaf.
tMC

Hangi matplotlib sürümü bu? 1.2.0 setp(subplot(111).get_xticklabels(), rotation=90)ile, Qt4Agg arka ucu ile iyi çalışır. Benim durumumda, tarafından sıfırlanır plt.hist(), bu yüzden sonra çağırıyorum, ancak plt.plot()sıfırlamıyor, bu yüzden iyi olmalısınız.
drevicko

1
@tMC mpl 1.2.0 ile, kodunuzu kopyaladım (bazı kukla verilerle), daha locs, labels = plt.xticks() plt.setp(labels, rotation=90)önce ekledim plt.plot(time, delay)ve iyi çalıştı.
drevicko

54

Appart from

plt.xticks(rotation=90)

bu da mümkündür:

plt.xticks(rotation='vertical')

Çalışıyor, ancak arsa yüksekliğinde bir sorun var
Roberto Marzocchi

plt.xticks(rotation=45) plt.savefig(nomefile,dpi=150, optimize=True) plt.clf()
Roberto Marzocchi

49

Benzer bir örnek buldum. Yine, rotasyon anahtar kelimesi .. iyi, anahtar.

from pylab import *
fig = figure()
ax = fig.add_subplot(111)
ax.bar( [0,1,2], [1,3,5] )
ax.set_xticks( [ 0.5, 1.5, 2.5 ] )
ax.set_xticklabels( ['tom','dick','harry'], rotation=45 ) ;

Bu işe yarıyor gibi görünüyor, ancak dönemden beri geçen süreyi saniye olarak gösteriyordatetime
tmc

32

Cevabım cjohnson318'in cevabından ilham alıyor, ancak sabit kodlu bir etiket listesi sağlamak istemedim; Mevcut etiketleri döndürmek istedim:

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

2
Bu artık işe yaramıyor gibi görünüyor. Hiçbir etkisi yok.
zbyszek

31

Kullanıyorsanız plt:

plt.xticks(rotation=90)

Arsa için pandalar veya deniz dibinin kullanılması durumunda, arsa axiçin eksen olarak kabul edilir:

ax.set_xticklabels(ax.get_xticklabels(), rotation=90)

Yukarıdakileri yapmanın başka bir yolu:

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

Tüm bu yöntemler diğer cevaplarda zaten gösterilmiştir. Bu cevap buraya ne ekliyor?
ImportanceOfBeingErnest

@ImportanceOfBeingErnest Bu, doğrudan matplotlib değil, panda veya denizdoğusu kullananlara çizim yapmak için yardımcı olmak içindir.
Manavalan Gajapathy

for tick in ax.get_xticklabels(): tick.set_rotation(45)benim için hile yaptı.
AP

30

Axes nesnesine döndürme uygulamak istiyorsanız, en kolay yolu kullanmaktır tick_params. Örneğin.

ax.tick_params(axis='x', labelrotation=90)

Matplotlib doküman referansı burada .

Bu, döndürülen bir dizi eksene sahip olduğunuzda kullanışlıdır plt.subplotsve kullanmaktan daha uygundur, set_xticksçünkü bu durumda kene etiketlerini de ayarlamanız gerekir ve ayrıca keneler üzerinde yinelenenlerden daha açıktır (bariz nedenlerle)


1
Buna ek olarak, bu çözüm, eksen nesnesini de döndürdüğü için panda veri çerçevesinin çizim işlevinde de çalışır. Buradan kontrol edin . Oldukça kullanışlı fonksiyon. pd_dataframe.plot().tick_params(axis='x', labelrotation=90).
metinsenturk

Bununla ilgili tek sorun, böyle bir şey kullanıyorsa etiketlerin yatay olarak nasıl hizalanacağını anlayamıyorum labelrotation=30.
getup8


3

Ne çizdiğinize bağlı olacaktır.

import matplotlib.pyplot as plt

 x=['long_text_for_a_label_a',
    'long_text_for_a_label_b',
    'long_text_for_a_label_c']
y=[1,2,3]
myplot = plt.plot(x,y)
for item in myplot.axes.get_xticklabels():
    item.set_rotation(90)

Bir Axes nesnesi veren pandalar ve deniz dibi için:

df = pd.DataFrame(x,y)
#pandas
myplot = df.plot.bar()
#seaborn 
myplotsns =sns.barplot(y='0',  x=df.index, data=df)
# you can get xticklabels without .axes cause the object are already a 
# isntance of it
for item in myplot.get_xticklabels():
    item.set_rotation(90)

Etiketleri döndürmeniz gerekiyorsa, yazı tipi boyutunu da değiştirmeniz gerekebilir, bunu font_scale=1.0yapmak için kullanabilirsiniz .


2

X ekseni etiketini 90 dereceye döndürmek için

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

Cevabınızın ne kadar kısa olduğunu seviyorum, ancak gönderdiğiniz şey geçerli Python kodu değil. Geçerli python kodu olarak nasıl yorumlanacağı benim için net değil.
Dave C

1

En basit çözüm kullanmaktır:

plt.xticks(rotation=XX)

Ayrıca

# Tweak spacing to prevent clipping of tick-labels
plt.subplots_adjust(bottom=X.XX)

örneğin rotasyon kullandığım tarihler = 45 ve alt = 0.20 ancak verileriniz için bazı testler yapabilirsiniz

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.