web-dev-qa-db-fra.com

Comment changer la taille de la police sur un graphique matplotlib

Comment peut-on changer la taille de la police pour tous les éléments (ticks, étiquettes, titre) sur un graphique matplotlib?

Je sais comment changer la taille des étiquettes de tick, cela se fait avec:

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

Mais comment changer le reste?

430
Herman Schaaf

De la documentation de matplotlib ,

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

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

Ceci définit la police de tous les éléments sur la police spécifiée par l'objet kwargs, font.

Vous pouvez également utiliser la méthode rcParamsupdate comme suggéré dans cette réponse :

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

ou

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

Vous pouvez trouver une liste complète des propriétés disponibles sur la page Personnalisation de matplotlib .

493
Herman Schaaf

Si vous êtes un maniaque du contrôle comme moi, vous pouvez définir explicitement toutes les tailles de police:

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

Notez que vous pouvez également définir les tailles en appelant la méthode rc sur matplotlib:

import matplotlib

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

# and so on ...
190
Pedro M Duarte
matplotlib.rcParams.update({'font.size': 22})
176
Marius Retegan

Si vous souhaitez modifier la taille de la police pour un tracé spécifique déjà créé, essayez ceci:

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)
169
ryggyr

Mise à jour: Reportez-vous au bas de la réponse pour connaître une méthode légèrement meilleure.
Mise à jour n ° 2: J'ai également modifié les polices de titre de légende.
Mise à jour # 3: Il y a un bogue dans Matplotlib 2.0. qui provoque des étiquettes de graduation pour les axes logarithmiques. pour revenir à la police par défaut. Devrait être corrigé dans la version 2.0.1 mais j'ai inclus la solution de contournement dans la deuxième partie de la réponse.

Cette réponse s'adresse à quiconque tente de modifier toutes les polices, y compris la légende, et à ceux qui essaient d'utiliser des polices et des tailles différentes pour chaque élément. Il n'utilise pas de rc (ce qui ne semble pas fonctionner pour moi). C'est assez lourd, mais je ne pouvais me familiariser personnellement avec aucune autre méthode. Il combine essentiellement la réponse de Ryggyr ici avec d'autres réponses sur 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()

L'avantage de cette méthode est que, en disposant de plusieurs dictionnaires de polices, vous pouvez choisir différentes polices/tailles/poids/couleurs pour les différents titres, choisir la police pour les libellés de coches et choisir la police pour la légende, le tout indépendamment.


UPDATE:

J'ai élaboré une approche légèrement différente, moins encombrée, qui supprime les dictionnaires de polices et autorise toutes les polices de votre système, même les polices .otf. Pour avoir des polices distinctes pour chaque élément, écrivez simplement plus de variables de type font_path et font_prop.

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

Espérons que ceci est une réponse complète

59
binaryfunt

Voici une approche totalement différente qui fonctionne étonnamment bien pour changer la taille des polices:

Changer la taille de la figure !

J'utilise habituellement un code comme celui-ci:

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)

Le plus petit vous donne la taille de la figure, le plus grand la police est par rapport au tracé . Cela améliore également les marqueurs. Remarque: je règle également le dpi ou le point par pouce. J'ai appris cela en postant sur le forum AMTA (American Modeling Teacher of America). Exemple du code ci-dessus: enter image description here

28
Prof Huster

Utiliser plt.tick_params(labelsize=14)

15
Andrey Nikishaev

Vous pouvez utiliser plt.rcParams["font.size"] pour définir font_size dans matplotlib et vous pouvez également utiliser plt.rcParams["font.family"] pour définir font_family dans matplotlib. Essayez cet exemple:

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

Basé sur ce qui précède:

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
nvd

Ceci est une extension de Marius Retegan réponse . Vous pouvez créer un fichier JSON séparé avec toutes vos modifications et le charger avec rcParams.update. Les modifications ne s'appliqueront qu'au script en cours. Alors

import json
from matplotlib import pyplot as plt, rcParams

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

et enregistrez ce fichier 'example_file.json' dans le même dossier.

{
  "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": ""
}
2
Michael H.

Je suis tout à fait d’accord avec le professeur Huster pour dire que la façon la plus simple de procéder consiste à modifier la taille de la figure, ce qui permet de conserver les polices par défaut. Je devais simplement compléter ceci avec une option bbox_inches lors de l'enregistrement de la figure au format PDF car les étiquettes des axes étaient coupées.

import matplotlib.pyplot as plt
plt.figure(figsize=(4,3))
plt.savefig('Basic.pdf', bbox_inches='tight')
1
user5320767