Come modificare la dimensione del carattere su un grafico matplotlib


542

Come si cambia la dimensione del carattere per tutti gli elementi (segni di spunta, etichette, titolo) su un grafico a matrice?

So come modificare le dimensioni dell'etichetta di spunta, questo è fatto con:

import matplotlib 
matplotlib.rc('xtick', labelsize=20) 
matplotlib.rc('ytick', labelsize=20) 

Ma come si cambia il resto?

Risposte:


630

Dalla documentazione matplotlib ,

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

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

Questo imposta il carattere di tutti gli articoli a carattere specificato dall'oggetto kwargs, font.

In alternativa, puoi anche utilizzare il rcParams updatemetodo come suggerito in questa risposta :

matplotlib.rcParams.update({'font.size': 22})

o

import matplotlib.pyplot as plt
plt.rcParams.update({'font.size': 22})

È possibile trovare un elenco completo delle proprietà disponibili nella pagina Personalizzazione di matplotlib .


2
bello, tranne che sovrascrive qualsiasi proprietà fontsize trovata sulla sua strada è_é
yota

2
Dove posso trovare più opzioni per elementi come 'family', 'weight'e così via?
Hawcks

2
@HermanSchaaf; Ho visitato quella pagina prima. Vorrei conoscere tutte le opzioni per 'family'come 'normal', 'sans-serif'ecc
haccks

77
Dal momento che molte persone iniziano con import matplotlib.pyplot as plt, come si potrebbe far notare che pyplotha rcpure. Puoi fare a plt.rc(...meno di dover modificare le tue importazioni.
Londra,

21
Per l'impaziente: la dimensione del carattere predefinita è 10, come nel secondo collegamento.
FvD

304

Se sei un maniaco del controllo come me, potresti voler impostare esplicitamente tutte le dimensioni dei caratteri:

import matplotlib.pyplot as plt

SMALL_SIZE = 8
MEDIUM_SIZE = 10
BIGGER_SIZE = 12

plt.rc('font', size=SMALL_SIZE)          # controls default text sizes
plt.rc('axes', titlesize=SMALL_SIZE)     # fontsize of the axes title
plt.rc('axes', labelsize=MEDIUM_SIZE)    # fontsize of the x and y labels
plt.rc('xtick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
plt.rc('ytick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
plt.rc('legend', fontsize=SMALL_SIZE)    # legend fontsize
plt.rc('figure', titlesize=BIGGER_SIZE)  # fontsize of the figure title

Nota che puoi anche impostare le dimensioni chiamando il rcmetodo su matplotlib:

import matplotlib

SMALL_SIZE = 8
matplotlib.rc('font', size=SMALL_SIZE)
matplotlib.rc('axes', titlesize=SMALL_SIZE)

# and so on ...

9
Ho provato molte delle risposte. Questo sembra il migliore, almeno nei notebook Jupyter. Basta copiare il blocco sopra nella parte superiore e personalizzare le tre costanti della dimensione del carattere.
fviktor,

3
Concordo con fvitkor, questa è la risposta migliore!
SeF

9
Per me la dimensione del titolo non ha funzionato. Ho usato:plt.rc('axes', titlesize=BIGGER_SIZE)
Fernando Irarrázaval G

1
Penso che tu possa combinare tutte le impostazioni per lo stesso oggetto in una riga. Ad esempio,plt.rc('axes', titlesize=SMALL_SIZE, labelsize=MEDIUM_SIZE)
BallpointBen

198
matplotlib.rcParams.update({'font.size': 22})

1
In questo caso questa soluzione funziona solo se creo una prima trama, quindi "aggiorna" come suggerito, il che porta alla dimensione del carattere aggiornata per le nuove figure. Forse la prima trama è necessaria per inizializzare rcParams ...
Songio

191

Se vuoi cambiare la dimensione del carattere solo per un grafico specifico che è già stato creato, prova questo:

import matplotlib.pyplot as plt

ax = plt.subplot(111, xlabel='x', ylabel='y', title='title')
for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] +
             ax.get_xticklabels() + ax.get_yticklabels()):
    item.set_fontsize(20)

1
Il mio scopo era di avere il carattere delle etichette xy, i segni di spunta e i titoli di dimensioni diverse. Una versione modificata di questo ha funzionato così bene per me.
Ébe Isaac,

6
Per ottenere anche le legende, usa ax.legend (). Get_texts (). Testato su Matplotlib 1.4.
James S.

Questo risponde alla domanda più direttamente. Grazie.
jimh

Potrebbe essere necessario un ax=plt.gca()se la trama è stata creata senza definire un asse.
Dylnan,

@JamesS. Piuttosto usare ax.get_legend().get_texts(), perché ax.legend()ridisegna l'intera legenda con i parametri predefiniti oltre a restituire il valore di ax.get_legend().
Guimoute,

69

Aggiornamento: vedi la parte inferiore della risposta per un modo leggermente migliore di farlo.
Aggiornamento n. 2: ho capito anche come cambiare i caratteri del titolo della legenda.
Aggiornamento n. 3: esiste un bug in Matplotlib 2.0.0 che causa il ripristino delle etichette di spunta per gli assi logaritmici sul carattere predefinito. Dovrebbe essere risolto in 2.0.1 ma ho incluso la soluzione alternativa nella seconda parte della risposta.

Questa risposta è per chiunque cerchi di cambiare tutti i caratteri, incluso per la legenda, e per chiunque cerchi di usare caratteri e dimensioni diverse per ogni cosa. Non usa rc (che non sembra funzionare per me). È piuttosto ingombrante ma non sono riuscito a fare i conti personalmente con nessun altro metodo. Fondamentalmente combina la risposta di Ryggyr qui con altre risposte su SO.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager

# Set the font dictionaries (for plot title and axis titles)
title_font = {'fontname':'Arial', 'size':'16', 'color':'black', 'weight':'normal',
              'verticalalignment':'bottom'} # Bottom vertical alignment for more space
axis_font = {'fontname':'Arial', 'size':'14'}

# Set the font properties (for use in legend)   
font_path = 'C:\Windows\Fonts\Arial.ttf'
font_prop = font_manager.FontProperties(fname=font_path, size=14)

ax = plt.subplot() # Defines ax variable by creating an empty plot

# Set the tick labels font
for label in (ax.get_xticklabels() + ax.get_yticklabels()):
    label.set_fontname('Arial')
    label.set_fontsize(13)

x = np.linspace(0, 10)
y = x + np.random.normal(x) # Just simulates some data

plt.plot(x, y, 'b+', label='Data points')
plt.xlabel("x axis", **axis_font)
plt.ylabel("y axis", **axis_font)
plt.title("Misc graph", **title_font)
plt.legend(loc='lower right', prop=font_prop, numpoints=1)
plt.text(0, 0, "Misc text", **title_font)
plt.show()

Il vantaggio di questo metodo è che, avendo diversi dizionari di caratteri, è possibile scegliere caratteri / dimensioni / pesi / colori diversi per i vari titoli, scegliere il carattere per le etichette di spunta e scegliere il carattere per la legenda, il tutto in modo indipendente.


AGGIORNARE:

Ho elaborato un approccio leggermente diverso, meno ingombrante che elimina i dizionari dei caratteri e consente qualsiasi tipo di carattere sul tuo sistema, anche i caratteri .otf. Per avere caratteri separati per ogni cosa, basta scrivere di più font_pathe font_propgradire le variabili.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager
import matplotlib.ticker
# Workaround for Matplotlib 2.0.0 log axes bug https://github.com/matplotlib/matplotlib/issues/8017 :
matplotlib.ticker._mathdefault = lambda x: '\\mathdefault{%s}'%x 

# Set the font properties (can use more variables for more fonts)
font_path = 'C:\Windows\Fonts\AGaramondPro-Regular.otf'
font_prop = font_manager.FontProperties(fname=font_path, size=14)

ax = plt.subplot() # Defines ax variable by creating an empty plot

# Define the data to be plotted
x = np.linspace(0, 10)
y = x + np.random.normal(x)
plt.plot(x, y, 'b+', label='Data points')

for label in (ax.get_xticklabels() + ax.get_yticklabels()):
    label.set_fontproperties(font_prop)
    label.set_fontsize(13) # Size here overrides font_prop

plt.title("Exponentially decaying oscillations", fontproperties=font_prop,
          size=16, verticalalignment='bottom') # Size here overrides font_prop
plt.xlabel("Time", fontproperties=font_prop)
plt.ylabel("Amplitude", fontproperties=font_prop)
plt.text(0, 0, "Misc text", fontproperties=font_prop)

lgd = plt.legend(loc='lower right', prop=font_prop) # NB different 'prop' argument for legend
lgd.set_title("Legend", prop=font_prop)

plt.show()

Spero che questa sia una risposta completa


40

Qui è totalmente diverso approccio che funziona sorprendentemente bene per modificare le dimensioni del carattere:

Cambia la dimensione della figura !

Di solito uso un codice come questo:

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(4,3))
ax = fig.add_subplot(111)
x = np.linspace(0,6.28,21)
ax.plot(x, np.sin(x), '-^', label="1 Hz")
ax.set_title("Oscillator Output")
ax.set_xlabel("Time (s)")
ax.set_ylabel("Output (V)")
ax.grid(True)
ax.legend(loc=1)
fig.savefig('Basic.png', dpi=300)

Più piccola è la dimensione della figura, più grande è il carattere rispetto alla trama . Ciò aumenta anche i marker. Nota Ho anche impostato il dpipunto o per pollice. L'ho imparato da un post sul forum AMTA (American Modeling Teacher of America). Esempio dal codice sopra:inserisci qui la descrizione dell'immagine


7
Per evitare che l'etichetta dell'asse venga tagliata, salvare la figura con l' bbox_inchesargomento fig.savefig('Basic.png', bbox_inches="tight")
Paw

Cosa succede se NON sto salvando la cifra? Sto complottando in Juypter Notebook e le etichette degli assi risultanti vengono tagliate.
Zythyr

Grazie! Sottolineare le impostazioni dpi mi è stato estremamente utile nella preparazione delle versioni stampabili dei miei grafici senza dover regolare tutte le dimensioni delle linee, le dimensioni dei caratteri, ecc.
ybull

27

Uso plt.tick_params(labelsize=14)


4
Grazie per lo snippet di codice, che potrebbe fornire un aiuto limitato e immediato. Una spiegazione adeguata migliorerebbe notevolmente il suo valore a lungo termine descrivendo perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con altre domande simili. Modifica la tua risposta per aggiungere alcune spiegazioni, inclusi i presupposti che hai formulato.
sepehr,

22

È possibile utilizzare plt.rcParams["font.size"]per impostare font_sizein matplotlibe inoltre è possibile utilizzare plt.rcParams["font.family"]per impostare font_familyin matplotlib. Prova questo esempio:

import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')

label = [1,2,3,4,5,6,7,8]
x = [0.001906,0.000571308,0.0020305,0.0037422,0.0047095,0.000846667,0.000819,0.000907]
y = [0.2943301,0.047778308,0.048003167,0.1770876,0.532489833,0.024611333,0.157498667,0.0272095]


plt.ylabel('eigen centrality')
plt.xlabel('betweenness centrality')
plt.text(0.001906, 0.2943301, '1 ', ha='right', va='center')
plt.text(0.000571308, 0.047778308, '2 ', ha='right', va='center')
plt.text(0.0020305, 0.048003167, '3 ', ha='right', va='center')
plt.text(0.0037422, 0.1770876, '4 ', ha='right', va='center')
plt.text(0.0047095, 0.532489833, '5 ', ha='right', va='center')
plt.text(0.000846667, 0.024611333, '6 ', ha='right', va='center')
plt.text(0.000819, 0.157498667, '7 ', ha='right', va='center')
plt.text(0.000907, 0.0272095, '8 ', ha='right', va='center')
plt.rcParams["font.family"] = "Times New Roman"
plt.rcParams["font.size"] = "50"
plt.plot(x, y, 'o', color='blue')

10

Ecco quello che generalmente utilizzo in Notebook Jupyter:

# Jupyter Notebook settings

from IPython.core.display import display, HTML
display(HTML("<style>.container { width:95% !important; }</style>"))
%autosave 0
%matplotlib inline
%load_ext autoreload
%autoreload 2

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"


# Imports for data analysis
import pandas as pd
import matplotlib.pyplot as plt
pd.set_option('display.max_rows', 2500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.max_colwidth', 2000)
pd.set_option('display.width', 2000)
pd.set_option('display.float_format', lambda x: '%.3f' % x)

#size=25
size=15
params = {'legend.fontsize': 'large',
          'figure.figsize': (20,8),
          'axes.labelsize': size,
          'axes.titlesize': size,
          'xtick.labelsize': size*0.75,
          'ytick.labelsize': size*0.75,
          'axes.titlepad': 25}
plt.rcParams.update(params)

8

Sulla base delle cose di cui sopra:

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

fontPath = "/usr/share/fonts/abc.ttf"
font = fm.FontProperties(fname=fontPath, size=10)
font2 = fm.FontProperties(fname=fontPath, size=24)

fig = plt.figure(figsize=(32, 24))
fig.text(0.5, 0.93, "This is my Title", horizontalalignment='center', fontproperties=font2)

plot = fig.add_subplot(1, 1, 1)

plot.xaxis.get_label().set_fontproperties(font)
plot.yaxis.get_label().set_fontproperties(font)
plot.legend(loc='upper right', prop=font)

for label in (plot.get_xticklabels() + plot.get_yticklabels()):
    label.set_fontproperties(font)

5

Questa è un'estensione della risposta di Marius Retegan . È possibile creare un file JSON separato con tutte le modifiche e caricarlo con rcParams.update. Le modifiche si applicheranno solo allo script corrente. Così

import json
from matplotlib import pyplot as plt, rcParams

s = json.load(open("example_file.json")
rcParams.update(s)

e salva questo 'esempio_file.json' nella stessa cartella.

{
  "lines.linewidth": 2.0,
  "axes.edgecolor": "#bcbcbc",
  "patch.linewidth": 0.5,
  "legend.fancybox": true,
  "axes.color_cycle": [
    "#348ABD",
    "#A60628",
    "#7A68A6",
    "#467821",
    "#CF4457",
    "#188487",
    "#E24A33"
  ],
  "axes.facecolor": "#eeeeee",
  "axes.labelsize": "large",
  "axes.grid": true,
  "patch.edgecolor": "#eeeeee",
  "axes.titlesize": "x-large",
  "svg.fonttype": "path",
  "examples.directory": ""
}

4

Concordo pienamente con il Prof Huster sul fatto che il modo più semplice di procedere è cambiare la dimensione della figura, che consente di mantenere i caratteri predefiniti. Ho solo dovuto integrare questo con un'opzione bbox_inches quando ho salvato la figura come pdf perché le etichette degli assi erano state tagliate.

import matplotlib.pyplot as plt
plt.figure(figsize=(4,3))
plt.savefig('Basic.pdf', bbox_inches='tight')
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.