Matplotlib zmniejsza rozmiar czcionki etykiet kleszczowych


299

Jak na figurze matplotlib mogę zmienić rozmiar czcionki dla etykiet kleszczy, używając ax1.set_xticklabels()mniejszej?

Ponadto, w jaki sposób można go obracać z poziomego na pionowy?


Dzięki, że zadałeś to pytanie, próbuję teraz rozwiązać ten problem. Nie jestem tu mocno opiniotwórczy, ale wygląda na to, że wyborcy uważają, że najlepsza odpowiedź nie jest zaakceptowana. Co myślisz?
Aaron Hall

Czy poprawnie przeczytałem, że istnieje co najmniej 5 różnych sposobów zmiany rozmiaru czcionki w Matplotlib? : D
famargar

Odpowiedzi:


127

Uwaga: nowsze wersje MPL mają skrót do tego zadania. Przykład pokazano w innej odpowiedzi na to pytanie: https://stackoverflow.com/a/11386056/42346

Poniższy kod ma charakter poglądowy i niekoniecznie musi być zoptymalizowany.

import matplotlib.pyplot as plt
import numpy as np

def xticklabels_example():
    fig = plt.figure() 

    x = np.arange(20)
    y1 = np.cos(x)
    y2 = (x**2)
    y3 = (x**3)
    yn = (y1,y2,y3)
    COLORS = ('b','g','k')

    for i,y in enumerate(yn):
        ax = fig.add_subplot(len(yn),1,i+1)

        ax.plot(x, y, ls='solid', color=COLORS[i]) 

        if i != len(yn) - 1:
            # all but last 
            ax.set_xticklabels( () )
        else:
            for tick in ax.xaxis.get_major_ticks():
                tick.label.set_fontsize(14) 
                # specify integer or one of preset strings, e.g.
                #tick.label.set_fontsize('x-small') 
                tick.label.set_rotation('vertical')

    fig.suptitle('Matplotlib xticklabels Example')
    plt.show()

if __name__ == '__main__':
    xticklabels_example()

wprowadź opis zdjęcia tutaj


84
Na marginesie: Zamiast zapętlać obiekty etykiety kleszcza, możesz użyć plt.setp. (Zobacz także ax.tick_params) Na przykład możesz po prostu zrobić plt.setp(ax.get_xticklabels(), rotation='vertical', fontsize=14). Ponadto obiekty osi mają ax.is_last_row()metodę, która może być przydatna w przypadkach takich jak twój przykład. Zamiast tego if i != len...możesz zrobić if not ax.is_last_row(). (Dlaczego to metoda, nie mam pojęcia ... Matplotlib nienawidzi właściwości, najwyraźniej!)
Joe Kington,

@Joe: to moja pierwsza wiadomość is_last_row(), dziękuję! Używałem plt.setpw przeszłości i niekoniecznie byłem pewien, że reprezentuje to bardziej kanoniczny sposób dostosowywania etykiet kleszczy. Dzięki temu usunąłeś wątpliwości. Mówiąc szerzej: twoje odpowiedzi, szczególnie w matplotlibtagu, często mnie zachwycają. Kontynuujcie wspaniałą pracę.
Mechanical_meat

1
Dzięki!! Doceniam miłe słowa, szczególnie od ciebie! W tym przypadku kanoniczny jest bardzo względny. plt.setpjest „matlab-ism”, a wyraźna pętla jest prawdopodobnie znacznie bardziej pythoniczna. Będąc nawróconym matlabem, setpczuję się naturalnie, ale każdy z nich ma swoje. Każdy z nich jest dość czytelny, imo
Joe Kington,

50
W nowych wersjach zauważyłem, że musisz użyć parametru labelize : np.ax.tick_params(axis='x', labelsize=8)
Vladtn

Powinien być get_ticklabels nieget_major_ticks
jez

505

W rzeczywistości istnieje prostszy sposób. Właśnie znalazłem:

import matplotlib.pyplot as plt
# We prepare the plot  
fig, ax = plt.subplots()

# We change the fontsize of minor ticks label 
ax.tick_params(axis='both', which='major', labelsize=10)
ax.tick_params(axis='both', which='minor', labelsize=8)

To jednak odpowiada tylko na wielkość labelczęści twojego pytania.


2
Użyj axis = 'x'lub, axis = 'y'aby zmodyfikować tylko jedną z osi
loved.by.Jesus

221

Aby określić jednocześnie rozmiar i obrót czcionki, spróbuj tego:

plt.xticks(fontsize=14, rotation=90)

4
Zauważ, że jest to używane podczas pracy z interfejsem pyplot podobnym do MATLAB. W przypadku interfejsu obiektowego należy zastosować metodę tick_params () obiektu osi lub metodę set_tick_params () obiektu osi (patrz inne odpowiedzi).
wombatonfire

54

Alternatywnie możesz po prostu zrobić:

import matplotlib as mpl
label_size = 8
mpl.rcParams['xtick.labelsize'] = label_size 

36
plt.tick_params(axis='both', which='minor', labelsize=12)

To jedyna odpowiedź, która działa, jeśli chcesz zmienić rozmiar czcionki bez ustawiania nowych etykiet.
David Stansby,

@DavidStansby Nie wierzę, że to prawda. Miałem dokładnie ten problem (wspomniany powyżej) i mogłem zastosować alternatywną metodę inną niż to rozwiązanie. usingax.xaxis.set_tick_params(labelsize=20)
Kyle Swanson

1
najprostsza odpowiedź, nie wymaga odniesienia do obiektu siekiery
jeremy_rutman

26

Kolejna alternatywa

Mam dwie działki obok siebie i chciałbym osobno dopasowywać etykiety.

Powyższe rozwiązania były bliskie, ale dla mnie nie działały. Znalazłem rozwiązanie z tej strony matplotlib .

ax.xaxis.set_tick_params(labelsize=20)

To załatwiło sprawę i od razu do rzeczy. W moim przypadku należało dostosować działkę po prawej stronie. W przypadku wykresu po lewej, odkąd tworzyłem nowe etykiety kleszczy, byłem w stanie dostosować czcionkę w tym samym procesie, co ustawienie etykiet.

to znaczy

ax1.set_xticklabels(ax1_x, fontsize=15)
ax1.set_yticklabels(ax1_y, fontsize=15)

dlatego użyłem właściwej działki,

ax2.xaxis.set_tick_params(labelsize=24)
ax2.yaxis.set_tick_params(labelsize=24)

Drobna subtelność ... Wiem ... ale mam nadzieję, że to komuś pomoże :)

Punkty bonusowe, jeśli ktoś wie, jak dostosować rozmiar czcionki etykiety wielkości rzędu.

wprowadź opis zdjęcia tutaj


22

W obecnych wersjach Matplotlib możesz to zrobić axis.set_xticklabels(labels, fontsize='small').


1
To zmusza cię też do określenia labels. Lepiej jest, jeśli możemy zmienić tylko rozmiar czcionki.
Guimoute,

16

Możesz również zmienić parametry wyświetlania etykiety, takie jak rozmiar czcionki, za pomocą linii takiej jak ta:

zed = [tick.label.set_fontsize(14) for tick in ax.yaxis.get_major_ticks()]

1
Myślę, że używanie list ze zrozumiałymi skutkami ubocznymi nie jest najlepszą praktyką. Sugerowałbym zamiast tego użyć standardowej pętli.
jjmontes

14

Używam mniejszej czcionki

ax1.set_xticklabels(xticklabels, fontsize=7)

i to działa!


jak definiujesz Xticklabels?
mLstudent33

10

Dla mnie działało:

ax2.xaxis.set_tick_params(labelsize=7)
ax2.yaxis.set_tick_params(labelsize=7)

Zaletą powyższego jest nie trzeba aby zapewnić arrayod labelsi współpracuje ze wszystkimi danymi na temat axes.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.