Jak ustawić tytuł czcionki i rozmiar czcionki etykiet osi w Matplotlib?

530

Tworzę postać w Matplotlib w następujący sposób:

from matplotlib import pyplot as plt

fig = plt.figure()
plt.plot(data)
fig.suptitle('test title')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
fig.savefig('test.jpg')

Chcę określić rozmiary czcionek dla tytułu figury i etykiet osi. Potrzebuję wszystkich trzech, aby mieć różne rozmiary czcionek, więc ustawienie globalnego rozmiaru czcionki ( mpl.rcParams['font.size']=x) nie jest tym, czego chcę. Jak ustawić rozmiary czcionek dla tytułu figury i etykiet osi indywidualnie?

vasek1
źródło
1
Byłem ciekawy, więc spróbowałem dodać twój mpl.rcParams['font.size'] = 20i spróbowałem zmienić wartości na 10 i 14. Najpierw odkryłem, że dostaję błędy, chyba że zmieniłem mplna plt. Ta zmiana usunęła błąd, ale wtedy wiersz kodu nie miał wpływu na moje tytuły ani etykiety. Pewnie, że ta składnia jest poprawna?
TMWP
teraz myślę na podstawie komentarzy do zaakceptowanej odpowiedzi, że problemem może być moja instrukcja importu, chociaż dlaczego nie zgłasza błędu, jeśli nie importuję komendy, jest poza mną. Czy podczas testowania mplpolecenia użyto innej linii importu ?
TMWP

Odpowiedzi:

772

Funkcje czynienia z tekstem jak label, titleitp akceptować parametry takie same jak matplotlib.text.Text. Do rozmiaru czcionki możesz użyć size/fontsize:

from matplotlib import pyplot as plt    

fig = plt.figure()
plt.plot(data)
fig.suptitle('test title', fontsize=20)
plt.xlabel('xlabel', fontsize=18)
plt.ylabel('ylabel', fontsize=16)
fig.savefig('test.jpg')

Do globalnego ustawienia titlei labelrozmiarów mpl.rcParamszawiera axes.titlesizei axes.labelsize. (Ze strony):

axes.titlesize      : large   # fontsize of the axes title
axes.labelsize      : medium  # fontsize of the x any y labels

(O ile widzę, nie ma sposobu, aby oddzielnie ustawiać xi yetykietować rozmiary.)

I widzę, że axes.titlesizeto nie ma wpływu suptitle. Myślę, że musisz to ustawić ręcznie.

Avaris
źródło
dzięki! czy istnieje sposób, aby ustawić to globalnie, ale wyraźnie dla (napisy, xlabel, ylabel)? Robię dużo wykresów i chcę tylko raz to określić ...
vasek1,
@ vasek1: Myślałem, że nie chcesz globalnych ustawień :). Do tego potrzebujesz mpl.rcParams. Zredagowałem swoją odpowiedź.
Avaris
16
Każdemu takiemu jak ja, szukając rozwiązania zmiany rozmiaru tytułów:plt.rcParams.update({'axes.titlesize': 'small'})
tommy.carstensen
Z rcParamslinku użyj figure.titlesizeoprócz axes.titlesize.
Mad Physicist,
1
@AlexanderMcFarlane. Pobiegłem python -c 'import matplotlib as mpl; print(mpl.__version__); print("figure.titlesize" in mpl.rcParams.keys())'. Wynikiem tego jest 1.5.1, True. 1) Jakiej wersji matplotlib używasz? Jaka wersja Pythona? 2) Czy może to być błąd, który z jakiegoś powodu akceptuje, strale nie unicodew Py2?
Szalony fizyk
90

Możesz to zrobić globalnie za pomocą słownika rcParams:

import matplotlib.pylab as pylab
params = {'legend.fontsize': 'x-large',
          'figure.figsize': (15, 5),
         'axes.labelsize': 'x-large',
         'axes.titlesize':'x-large',
         'xtick.labelsize':'x-large',
         'ytick.labelsize':'x-large'}
pylab.rcParams.update(params)
Tsando
źródło
5
Jakie są inne rozmiary oprócz 'x-large'?
Martin Thoma,
15
„xx-small”, „x-small”, „small”, „medium”, „large”, „x-large”, „xx-large”. Zobacz matplotlib.org/api/…
tsando
Użyj, pylab.rcParams.keys()aby zobaczyć pełną listę parametrów.
Nirmal,
Dzięki. Czy istnieje sposób, aby ustawić globalnie wyraźnych wielkości liczbowych do tytułu i etykiet osi zamiast zawsze robi ax.set_title('some title', fontsize=15), ax.set_xlabel('some xlabel', fontsize=12)? Wygląda na to, że rcParamsakceptuje tylko ciągi znaków.
timgeb
4
Możesz także użyć liczb ...'axes.labelsize': 32,
mimoralea
65

Jeśli jesteś bardziej przyzwyczajony do używania axobiektów do drukowania, możesz ax.xaxis.label.set_size()łatwiej je zapamiętać lub przynajmniej łatwiej znaleźć przy użyciu tabulatora w terminalu ipython. Wydaje się, że po operacji konieczne jest przerysowanie, aby zobaczyć efekt. Na przykład:

import matplotlib.pyplot as plt

# set up a plot with dummy data
fig, ax = plt.subplots()
x = [0, 1, 2]
y = [0, 3, 9]
ax.plot(x,y)

# title and labels, setting initial sizes
fig.suptitle('test title', fontsize=12)
ax.set_xlabel('xlabel', fontsize=10)
ax.set_ylabel('ylabel', fontsize='medium')   # relative to plt.rcParams['font.size']

# setting label sizes after creation
ax.xaxis.label.set_size(20)
plt.draw()

Nie znam podobnego sposobu ustawiania rozmiaru napisów po ich utworzeniu.

zakręcić
źródło
fig.suptitle('test title', fontsize = 20)wydaje się działać. ax.set_xlabel('xlabel', fontsize = 20)' also works, in which case we can do away with ax.xaxis.label.set_size (20) `.
T_T
1
@T_T To prawda, a te formularze są podobne do powyższej odpowiedzi Avaris. Dodam je dla kompletności. Nadal znajduję zastosowanie, ax.xaxis.label.set_size()gdy pracuję interaktywnie z fabułą ipython i chcę przeprowadzić szybką wizualną ocenę różnych rozmiarów czcionek.
spinup
Czy wiesz, czy istnieje jakaś (ukryta) różnica między użyciem obiektów toporów i obiektów figur, czy oba są idealnie równoważne? Dlaczego istnieją różne interfejsy dla niektórych funkcji? (plt.xlabel () vs. ax.set_xlabel ())
normanius
1
@normanius, jeśli masz na myśli topór i figę w powyższym przykładzie, są to zupełnie różne obiekty - figa to ogólna figura, która może zawierać kilka osi. Tak więc figa i topór mają różne właściwości. Pod względem różnicy między wywołaniami typu pyplot a wywołaniami obiektowymi (np. plt.xlabel()Vs. ax.set_xlabel()jak mówisz), są one równoważne, z zastrzeżeniem, że plt.*funkcje działają na bieżącej osi / figurze. Więc jeśli ustawisz figurę z wieloma osiami, prawdopodobnie będziesz chciał użyć jawnych wywołań, ax1.set_xlabel()aby uniknąć nieporozumień.
spinup
19

Aby zmodyfikować tylko czcionkę tytułu (a nie czcionkę osi), użyłem tego:

import matplotlib.pyplot as plt
fig = plt.Figure()
ax = fig.add_subplot(111)
ax.set_title('My Title', fontdict={'fontsize': 8, 'fontweight': 'medium'})

Fontdict akceptuje wszystkie kwargs z matplotlib.text.Text .

tammoj
źródło
8

Zgodnie z oficjalnym przewodnikiem stosowanie pylabnie jest już zalecane. matplotlib.pyplotnależy zamiast tego stosować bezpośrednio.

rcParamsNależy dokonać globalnego ustawienia rozmiarów czcionek za pomocą

import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 16
plt.rcParams['axes.titlesize'] = 16

# or

params = {'axes.labelsize': 16,
          'axes.titlesize': 16}
plt.rcParams.update(params)

# or

import matplotlib as mpl
mpl.rc('axes', labelsize=16, titlesize=16)

# or 

axes = {'labelsize': 16,
        'titlesize': 16}
mpl.rc('axes', **axes)

Wartości domyślne można przywrócić za pomocą

plt.rcParams.update(plt.rcParamsDefault)

Możesz to również zrobić, tworząc arkusz stylów w stylelibkatalogu w katalogu konfiguracyjnym matplotlib (możesz pobrać katalog konfiguracji z matplotlib.get_configdir()). Format arkusza stylów to

axes.labelsize: 16
axes.titlesize: 16

Jeśli masz arkusz stylów /path/to/mpl_configdir/stylelib/mystyle.mplstyle, możesz go użyć za pośrednictwem

plt.style.use('mystyle')

# or, for a single section

with plt.style.context('mystyle'):
    # ...

Możesz także utworzyć (lub zmodyfikować) plik matplotlibrc, który ma ten sam format

axes.labelsize = 16
axes.titlesize = 16

W zależności od tego, który plik matplotlibrc zmodyfikujesz, zmiany zostaną zastosowane tylko w bieżącym katalogu roboczym, dla wszystkich katalogów roboczych, które nie mają pliku matplotlibrc, lub dla wszystkich katalogów roboczych, które nie mają pliku matplotlibrc i gdzie żaden inny plik matplotlibrc nie ma zostało określone. Zobacz tę sekcję uzyskać więcej informacji, dostosowywania strony matplotlib.

Pełną listę rcParamsklawiszy można pobrać za pomocą plt.rcParams.keys(), ale w celu dostosowania rozmiarów czcionek masz (kursywa zacytowana tutaj )

  • axes.labelsize- Rozmiar czcionki etykiet xiy
  • axes.titlesize- Rozmiar czcionki tytułu osi
  • figure.titlesize- Rozmiar tytułu figury ( Figure.suptitle())
  • xtick.labelsize- Rozmiar czcionki etykiet kleszczy
  • ytick.labelsize- Rozmiar czcionki etykiet kleszczy
  • legend.fontsize- Rozmiar czcionki dla legend ( plt.legend(), fig.legend())
  • legend.title_fontsize- Rozmiar czcionki dla tytułów legend, Noneustawiony na taki sam jak domyślne osie. Zobacz tę odpowiedź na przykład użycia.

z których przyjąć rozmiary ciąg {'xx-small', 'x-small', 'smaller', 'small', 'medium', 'large', 'larger', 'x-large', 'xxlarge'}albo floatin pt. Rozmiary ciągu są definiowane w stosunku do domyślnego rozmiaru czcionki określonego przez

  • font.size- domyślny rozmiar czcionki dla tekstu, podany w pkt. 10 pkt jest wartością standardową

Dodatkowo można określić wagę (choć tylko dla domyślnej, na którą wygląda)

  • font.weight- Domyślna grubość czcionki używanej przez text.Text. Akceptuje {100, 200, 300, 400, 500, 600, 700, 800, 900}lub 'normal'(400), 'bold'(700) 'lighter', i 'bolder'( w odniesieniu do bieżącej masy ).
William Miller
źródło
2

Alternatywnym rozwiązaniem zmiany rozmiaru czcionki jest zmiana wypełnienia. Gdy Python zapisuje plik PNG, możesz zmienić układ za pomocą okna dialogowego, które zostanie otwarte. Na tym etapie można zmienić odstępy między osiami, wypełnienie, jeśli chcesz.

Naz
źródło
2

Miejsce right_axwcześniejset_ylabel()

ax.right_ax.set_ylabel('AB scale')

Chane Badr Eddine
źródło
-3

7 (najlepsze rozwiązanie)

 from numpy import*
 import matplotlib.pyplot as plt
 X = linspace(-pi, pi, 1000)

class Crtaj:

    def nacrtaj(self,x,y):
         self.x=x
         self.y=y
         return plt.plot (x,y,"om")

def oznaci(self):
    return plt.xlabel("x-os"), plt.ylabel("y-os"), plt.grid(b=True)

6 (nieco gorsze rozwiązanie)

from numpy import*
M = array([[3,2,3],[1,2,6]])
class AriSred(object):
    def __init__(self,m):
    self.m=m

def srednja(self):
    redovi = len(M)
    stupci = len (M[0])
    lista=[]
    a=0
    suma=0
    while a<stupci:
        for i in range (0,redovi):
            suma=suma+ M[i,a]
        lista.append(suma)
        a=a+1
        suma=0
    b=array(lista) 
    b=b/redovi
    return b



OBJ = AriSred(M)
sr = OBJ.srednja()
shapeshifter123
źródło
2
Chociaż ten kod może stanowić rozwiązanie problemu OP, zdecydowanie zaleca się podanie dodatkowego kontekstu dotyczącego przyczyny i / lub sposobu, w jaki ten kod odpowiada na pytanie. Tylko odpowiedzi na kod zwykle stają się bezużyteczne na dłuższą metę, ponieważ przyszli widzowie doświadczający podobnych problemów nie mogą zrozumieć uzasadnienia rozwiązania.
E. Zeytinci