Come posso impostare il titolo della figura e la dimensione del carattere delle etichette degli assi in Matplotlib?


531

Sto creando una figura in Matplotlib in questo modo:

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')

Voglio specificare le dimensioni del carattere per il titolo della figura e le etichette degli assi. Ho bisogno che tutti e tre abbiano dimensioni del carattere diverse, quindi impostare una dimensione del carattere globale ( mpl.rcParams['font.size']=x) non è quello che voglio. Come posso impostare le dimensioni dei caratteri per il titolo della figura e le etichette degli assi singolarmente?


1
Ero curioso così ho provato ad aggiungere i tuoi mpl.rcParams['font.size'] = 20e cercato i valori che cambiano a 10 e 14. In primo luogo ho scoperto che ho avuto errori a meno che non ho cambiato mpla plt. Quella modifica ha eliminato l'errore ma poi la riga di codice non ha avuto alcun effetto sui miei titoli o etichette. Sicuro che questa sintassi sia giusta?
TMWP

ora sto pensando dai commenti sulla risposta accettata che il problema potrebbe essere la mia dichiarazione di importazione anche se il motivo per cui non genera un errore se non ho importato il comando è oltre me. C'è un'altra linea di importazione che hai usato durante il test del mplcomando?
TMWP

Risposte:


774

Le funzioni che si occupano di testo come label, titleecc accettano parametri stessi come matplotlib.text.Text. Per la dimensione del carattere puoi usare 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')

Per impostazione globale titlee labeldimensioni, mpl.rcParamscontiene axes.titlesizee axes.labelsize. (Dalla pagina):

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

(Per quanto posso vedere, non c'è modo di impostare xed yetichettare le dimensioni separatamente.)

E vedo che axes.titlesizenon influisce suptitle. Immagino che devi impostarlo manualmente.


Grazie! c'è un modo per impostarlo globalmente ma esplicitamente per (sottotitoli, xlabel, ylabel)? Sto realizzando un sacco di grafici e voglio solo specificarlo una volta ...
vasek1

@ vasek1: pensavo non volessi un ambiente globale :). Per quello che ti serve mpl.rcParams. Ho modificato la mia risposta.
Avaris,

16
A chiunque come me cerchi la soluzione per cambiare la dimensione del titolo:plt.rcParams.update({'axes.titlesize': 'small'})
tommy.carstensen,

Dal rcParamscollegamento, utilizzare figure.titlesizeoltre a axes.titlesize.
Fisico pazzo,

1
@AlexanderMcFarlane. Ho corso python -c 'import matplotlib as mpl; print(mpl.__version__); print("figure.titlesize" in mpl.rcParams.keys())'. Il risultato è 1.5.1, True. 1) Quale versione di matplotlib stai usando? Quale versione di Python? 2) Potrebbe essere un bug che per qualche motivo accetta strma non unicodein Py2?
Fisico pazzo,

90

Puoi farlo anche a livello globale tramite un dizionario 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)

5
Quali sono le altre dimensioni oltre 'x-large'?
Martin Thoma,

15
'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'. Vedi matplotlib.org/api/…
tsando l'

Utilizzare pylab.rcParams.keys()per visualizzare l'elenco completo dei parametri.
Nirmal,

Grazie. C'è un modo per impostare a livello globale dimensioni esplicite numerici per il titolo e l'asse-etichette invece di fare sempre ax.set_title('some title', fontsize=15), ax.set_xlabel('some xlabel', fontsize=12)? Sembra che rcParamsaccetta solo stringhe.
timbro

4
Puoi anche usare i numeri ...'axes.labelsize': 32,
mimoralea,

65

Se sei più abituato a usare gli axoggetti per eseguire la stampa, potresti trovare ax.xaxis.label.set_size()più facile da ricordare, o almeno più facile da trovare usando la scheda in un terminale ipython. Sembra aver bisogno di un'operazione di ridisegno dopo per vedere l'effetto. Per esempio:

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()

Non conosco un modo simile per impostare la dimensione dei sottotitoli dopo che è stato creato.


fig.suptitle('test title', fontsize = 20)sembra funzionare. 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 È vero, e questi moduli sono simili alla risposta di Avaris sopra. Li aggiungerò per completezza. Trovo ancora utile ax.xaxis.label.set_size()quando lavoro in modo interattivo con una trama di IPython e voglio fare una rapida valutazione visiva di una varietà di dimensioni dei caratteri.
spinup,

Sai se c'è qualche differenza (nascosta) tra l'uso di oggetti ax e oggetti figura, o sono entrambi perfettamente equivalenti? Perché ci sono interfacce diverse per alcune funzionalità? (plt.xlabel () vs. ax.set_xlabel ())
normanius

1
@normanius, se intendete ax e fig nell'esempio sopra, sono oggetti abbastanza diversi: fig è la figura generale, che può contenere diversi assi. Quindi fico e ascia hanno proprietà diverse. In termini di differenza tra le chiamate di tipo pyplot e le chiamate di oggetti (ad es. plt.xlabel()Vs. ax.set_xlabel()come dici tu), sono equivalenti, con l'avvertenza che le plt.*funzioni lavorano sull'asse / figura corrente . Quindi, impostando una figura con più assi, probabilmente vorrai usare chiamate esplicite come ax1.set_xlabel()per evitare confusione.
spinup

20

Per modificare solo il carattere del titolo (e non il carattere dell'asse) ho usato questo:

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

Il fontdict accetta tutti i kwarg da matplotlib.text.Text .


8

Secondo la guida ufficiale , l'uso di pylabnon è più raccomandato. matplotlib.pyplotdovrebbe essere usato direttamente invece.

L'impostazione globale delle dimensioni dei caratteri tramite rcParamsdovrebbe essere eseguita con

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)

Le impostazioni predefinite possono essere ripristinate utilizzando

plt.rcParams.update(plt.rcParamsDefault)

Puoi anche farlo creando un foglio di stile nella stylelibdirectory nella directory di configurazione matplotlib (puoi ottenere la tua directory di configurazione matplotlib.get_configdir()). Il formato del foglio di stile è

axes.labelsize: 16
axes.titlesize: 16

Se hai un foglio di stile, /path/to/mpl_configdir/stylelib/mystyle.mplstylepuoi usarlo tramite

plt.style.use('mystyle')

# or, for a single section

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

È inoltre possibile creare (o modificare) un file matplotlibrc che condivide il formato

axes.labelsize = 16
axes.titlesize = 16

A seconda del file matplotlibrc che si modifica, queste modifiche verranno utilizzate solo per la directory di lavoro corrente, per tutte le directory di lavoro che non dispongono di un file matplotlibrc o per tutte le directory di lavoro che non dispongono di un file matplotlibrc e dove nessun altro file matplotlibrc ha stato specificato. Vedi questa sezione della pagina personalizzazione di matplotlib per maggiori dettagli.

È rcParamspossibile recuperare un elenco completo dei tasti tramite plt.rcParams.keys(), ma per regolare le dimensioni dei caratteri disponibili (corsivo citato da qui )

  • axes.labelsize- Dimensione dei caratteri delle etichette xey
  • axes.titlesize- Dimensione carattere del titolo degli assi
  • figure.titlesize- Dimensione del titolo della figura ( Figure.suptitle())
  • xtick.labelsize- Dimensione dei caratteri delle etichette tick
  • ytick.labelsize- Dimensione dei caratteri delle etichette tick
  • legend.fontsize- Dimensione caratteri per legende ( plt.legend(), fig.legend())
  • legend.title_fontsize- Carattere per i titoli delle legende, Noneimpostato sullo stesso degli assi predefiniti. Vedi questa risposta per un esempio di utilizzo.

tutti che accettano dimensioni di stringa {'xx-small', 'x-small', 'smaller', 'small', 'medium', 'large', 'larger', 'x-large', 'xxlarge'}o un floatin pt. Le dimensioni della stringa sono definite in relazione alla dimensione del carattere predefinita specificata da

  • font.size- la dimensione del carattere predefinita per il testo, espressa in punti. 10 pt è il valore standard

Inoltre, è possibile specificare il peso (anche se solo per impostazione predefinita)

  • font.weight- Il peso predefinito del carattere utilizzato da text.Text. Accetta {100, 200, 300, 400, 500, 600, 700, 800, 900}o 'normal'(400), 'bold'(700) 'lighter', e 'bolder'( relativo rispetto al peso corrente ).

2

Una soluzione alternativa alla modifica della dimensione del carattere consiste nel modificare il riempimento. Quando Python salva il tuo PNG, puoi cambiare il layout usando la finestra di dialogo che si apre. La spaziatura tra gli assi, imbottitura se vuoi, può essere modificata in questa fase.



-3

7 (migliore soluzione)

 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 (soluzione leggermente peggiore)

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()

2
Sebbene questo codice possa fornire una soluzione al problema di OP, si consiglia vivamente di fornire un contesto aggiuntivo in merito al perché e / o al modo in cui questo codice risponde alla domanda. Le risposte al codice diventano generalmente inutili a lungo termine perché i futuri spettatori che riscontrano problemi simili non possono comprendere il ragionamento alla base della soluzione.
E. Zeytinci,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.