Comment définir la taille de la police des titres des figures et des axes dans Matplotlib?

531

Je crée une figure dans Matplotlib comme ceci:

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

Je veux spécifier des tailles de police pour le titre de la figure et les étiquettes d'axe. J'ai besoin que les trois soient des tailles de police différentes, donc définir une taille de police globale ( mpl.rcParams['font.size']=x) n'est pas ce que je veux. Comment définir les tailles de police pour le titre de la figure et les étiquettes d'axe individuellement?

vasek1
la source
1
J'étais curieux alors j'ai essayé d'ajouter votre mpl.rcParams['font.size'] = 20et j'ai essayé de changer les valeurs à 10 et 14. J'ai d'abord trouvé que j'avais des erreurs à moins de changer mplpour plt. Cette modification a effacé l'erreur, mais la ligne de code n'a eu aucun effet sur mes titres ou étiquettes. Bien sûr, cette syntaxe est correcte?
TMWP
maintenant, je pense, d'après les commentaires sur la réponse acceptée, que le problème pourrait être ma déclaration d'importation, bien que la raison pour laquelle elle ne génère pas d'erreur si je n'ai pas importé la commande me dépasse. Y a-t-il une autre ligne d'importation que vous avez utilisée lors du test de la mplcommande?
TMWP

Réponses:

774

Fonctions traitant de texte comme label, title, etc. acceptent les mêmes paramètres que matplotlib.text.Text. Pour la taille de police, vous pouvez utiliser 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')

Pour les réglages titleet labeltailles globaux, mpl.rcParamscontient axes.titlesizeet axes.labelsize. (À partir de la page):

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

(Pour autant que je puisse voir, il n'y a aucun moyen de définir xet d' yétiqueter les tailles séparément.)

Et je vois que cela axes.titlesizen'affecte pas suptitle. Je suppose que vous devez régler cela manuellement.

Avaris
la source
Merci! existe-t-il un moyen de définir cela globalement mais explicitement pour (suptitle, xlabel, ylabel)? Je fais beaucoup de graphiques et je veux juste le spécifier une fois ...
vasek1
@ vasek1: Je pensais que vous ne vouliez pas de réglage global :). Pour cela, vous en avez besoin mpl.rcParams. J'ai édité ma réponse.
Avaris
16
À toute autre personne comme moi qui cherche la solution pour changer la taille du titre:plt.rcParams.update({'axes.titlesize': 'small'})
tommy.carstensen
À partir du rcParamslien, utilisez figure.titlesizeen plus de axes.titlesize.
Mad Physicist
1
@AlexanderMcFarlane. J'ai couru python -c 'import matplotlib as mpl; print(mpl.__version__); print("figure.titlesize" in mpl.rcParams.keys())'. Le résultat est 1.5.1, True. 1) Quelle version de matplotlib utilisez-vous? Quelle version de Python? 2) Serait-ce un bug où, pour une raison quelconque, il accepte strmais pas unicodedans Py2?
Mad Physicist
90

Vous pouvez également le faire globalement via un dictionnaire 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
la source
5
Quelles sont les autres tailles en plus 'x-large'?
Martin Thoma
15
«xx-small», «x-small», «small», «medium», «large», «x-large», «xx-large». Voir matplotlib.org/api/…
tsando
Utilisez pylab.rcParams.keys()pour voir la liste complète des paramètres.
Nirmal
Merci. Est - il possible de définir globalement tailles numériques explicites pour le titre et l'axe des étiquettes au lieu de toujours faire ax.set_title('some title', fontsize=15), ax.set_xlabel('some xlabel', fontsize=12)? Il semble rcParamsque n'accepte que des chaînes.
timgeb
4
Vous pouvez également utiliser des nombres ...'axes.labelsize': 32,
mimoralea
65

Si vous êtes plus habitué à utiliser des axobjets pour faire votre traçage, vous trouverez peut-être le ax.xaxis.label.set_size()plus facile à mémoriser, ou du moins plus facile à trouver en utilisant tab dans un terminal ipython. Il semble avoir besoin d'une opération de rafraîchissement après pour voir l'effet. Par exemple:

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

Je ne connais pas de méthode similaire pour définir la taille du sous-titre après sa création.

Tournoiement en haut
la source
fig.suptitle('test title', fontsize = 20)semble fonctionner. 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 C'est vrai, et ces formulaires sont similaires à la réponse d'Avaris ci-dessus. Je vais les ajouter pour être complet. Je trouve toujours une utilisation ax.xaxis.label.set_size()lorsque je travaille de manière interactive avec un tracé ipython et je veux faire une évaluation visuelle rapide d'une variété de tailles de police.
spinup
Savez-vous s'il existe une différence (cachée) entre l'utilisation d'objets hache et d'objets figure, ou sont-ils parfaitement équivalents? Pourquoi existe-t-il différentes interfaces pour certaines fonctionnalités? (plt.xlabel () vs ax.set_xlabel ())
normanius
1
@normanius, si vous voulez dire hache et figue dans l'exemple ci-dessus, ce sont des objets très différents - fig est le chiffre global, qui peut contenir plusieurs axes. La figue et la hache ont donc des propriétés différentes. En termes de différence entre les appels de type pyplot et les appels d'objet (par exemple plt.xlabel()vs ax.set_xlabel()comme vous le dites), ils sont équivalents, avec la mise en garde que les plt.*fonctions fonctionnent sur l' axe / figure actuel . Donc, si vous configurez une figure avec plusieurs axes, vous voudrez probablement utiliser des appels explicites ax1.set_xlabel()pour éviter toute confusion.
spinup
20

Pour modifier uniquement la police du titre (et non la police de l'axe), j'ai utilisé ceci:

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

Le fontdict accepte tous les kwargs de matplotlib.text.Text .

tammoj
la source
8

Selon le guide officiel , l'utilisation de pylabn'est plus recommandée. matplotlib.pyplotdoit être utilisé directement à la place.

La définition globale des tailles de police via rcParamsdoit être effectuée avec

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)

Les valeurs par défaut peuvent être restaurées à l'aide de

plt.rcParams.update(plt.rcParamsDefault)

Vous pouvez également le faire en créant une feuille de style dans le stylelibrépertoire sous le répertoire de configuration matplotlib (vous pouvez obtenir votre répertoire de configuration depuis matplotlib.get_configdir()). Le format de la feuille de style est

axes.labelsize: 16
axes.titlesize: 16

Si vous avez une feuille de style sur, /path/to/mpl_configdir/stylelib/mystyle.mplstylevous pouvez l’utiliser via

plt.style.use('mystyle')

# or, for a single section

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

Vous pouvez également créer (ou modifier) ​​un fichier matplotlibrc qui partage le format

axes.labelsize = 16
axes.titlesize = 16

Selon le fichier matplotlibrc que vous modifiez, ces changements seront utilisés uniquement pour le répertoire de travail actuel, pour tous les répertoires de travail qui n'ont pas de fichier matplotlibrc ou pour tous les répertoires de travail qui n'ont pas de fichier matplotlibrc et où aucun autre fichier matplotlibrc n'a été spécifié. Voir cette section de la page de personnalisation de matplotlib pour plus de détails.

Une liste complète des rcParamstouches peut être récupérée via plt.rcParams.keys(), mais pour ajuster les tailles de police que vous avez (italique cité à partir d' ici )

  • axes.labelsize- Taille de police des étiquettes x et y
  • axes.titlesize- Taille de police du titre des axes
  • figure.titlesize- Taille du titre de la figure ( Figure.suptitle())
  • xtick.labelsize- Taille de police des étiquettes des ticks
  • ytick.labelsize- Taille de police des étiquettes des ticks
  • legend.fontsize- Taille de police pour les légendes ( plt.legend(), fig.legend())
  • legend.title_fontsize- Taille de police pour les titres de légende, définie Nonesur la même valeur que les axes par défaut. Voir cette réponse pour un exemple d'utilisation.

qui acceptent tous les tailles de chaîne {'xx-small', 'x-small', 'smaller', 'small', 'medium', 'large', 'larger', 'x-large', 'xxlarge'}ou un floatpouce pt. Les tailles de chaîne sont définies par rapport à la taille de police par défaut qui est spécifiée par

  • font.size- la taille de police par défaut pour le texte, indiquée en pts. 10 pt est la valeur standard

En outre, le poids peut être spécifié (mais uniquement pour la valeur par défaut, il apparaît) par

  • font.weight- Le poids par défaut de la police utilisée par text.Text. Accepte {100, 200, 300, 400, 500, 600, 700, 800, 900}ou 'normal'(400), 'bold'(700),, 'lighter'et 'bolder'( par rapport au poids actuel ).
William Miller
la source
2

Une autre solution pour modifier la taille de la police consiste à modifier le remplissage. Lorsque Python enregistre votre PNG, vous pouvez modifier la mise en page à l'aide de la boîte de dialogue qui s'ouvre. L'espacement entre les axes, le rembourrage si vous le souhaitez peuvent être modifiés à ce stade.

Naz
la source
2

Placer right_axavantset_ylabel()

ax.right_ax.set_ylabel('AB scale')

Chane Badr Eddine
la source
-3

7 (meilleure solution)

 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 (solution légèrement pire)

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
la source
2
Bien que ce code puisse fournir une solution au problème d'OP, il est fortement recommandé de fournir un contexte supplémentaire concernant pourquoi et / ou comment ce code répond à la question. Les réponses de code uniquement deviennent généralement inutiles à long terme car les futurs téléspectateurs rencontrant des problèmes similaires ne peuvent pas comprendre le raisonnement derrière la solution.
E. Zeytinci