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?

Otwórz drogę
źródło
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

mięso_mechaniczne
źródło
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.

Autiwa
źródło
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)
scottlittle
źródło
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 
użytkownik2468932
źródło
36
plt.tick_params(axis='both', which='minor', labelsize=12)
jingweimo
źródło
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

Kyle Swanson
źródło
22

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

Christoph
źródło
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()]
ATX_Bigfoot
źródło
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!

Pengyao
źródło
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.

Kryptoman
źródło