Matplotlib, police cohérente utilisant latex

Mon problème est que j'aimerais utiliser Latex titres dans certaines parcelles, et pas de latex dans d'autres. À l'heure actuelle, matplotlib a deux polices par défaut différentes pour les titres Latex et les titres non Latex et j'aimerais que les deux soient cohérents. Y a - t-il un paramètre RC que je dois changer qui permettra cela automatiquement?

Je génère un tracé avec le code suivant:

import numpy as np
from matplotlib import pyplot as plt

tmpData = np.random.random( 300 )

##Create a plot with a tex title
ax = plt.subplot(211)
plt.plot(np.arange(300), tmpData)
plt.title(r'$W_y(tau, j=3)$')
plt.setp(ax.get_xticklabels(), visible = False)

##Create another plot without a tex title
plt.subplot(212)
plt.plot(np.arange(300), tmpData )
plt.title(r'Some random numbers')
plt.show()

Voici l'incohérence dont je parle. Les étiquettes de tick d'axe sont minces par rapport aux titres.:

33
demandé sur ncRubert 2012-07-06 22:28:24

2 réponses

Pour que le texte de style Tex/mathtext ressemble au texte normal, vous devez définir la police mathtext sur Bitstream Vera Sans,

import matplotlib
matplotlib.rcParams['mathtext.fontset'] = 'custom'
matplotlib.rcParams['mathtext.rm'] = 'Bitstream Vera Sans'
matplotlib.rcParams['mathtext.it'] = 'Bitstream Vera Sans:italic'
matplotlib.rcParams['mathtext.bf'] = 'Bitstream Vera Sans:bold'
matplotlib.pyplot.title(r'ABC123 vs $\mathrm{ABC123}^{123}$')

Si vous voulez que le texte normal ressemble au texte mathtext, vous pouvez tout changer en Stix. Cela affectera les étiquettes, les titres,les tiques, etc.

import matplotlib
matplotlib.rcParams['mathtext.fontset'] = 'stix'
matplotlib.rcParams['font.family'] = 'STIXGeneral'
matplotlib.pyplot.title(r'ABC123 vs $\mathrm{ABC123}^{123}$')

L'idée de base est que vous devez définir à la fois les polices regular et mathtext pour qu'elles soient identiques, et la méthode pour le faire est un peu obscure. Vous pouvez voir une liste des polices personnalisées,

sorted([f.name for f in matplotlib.font_manager.fontManager.ttflist])

Comme d'autres ont mentionné, vous pouvez également avoir Latex rendre tout pour vous avec une police en définissant le texte.usetex dans les rcParams, mais c'est lent et pas tout à fait nécessaire.

30
répondu lindyblackburn 2014-12-30 21:25:59

Modifier

Si vous voulez changer les polices utilisées par LaTeX dans matplotlib, consultez cette page

Http://matplotlib.sourceforge.net/users/usetex.html

L'un des exemples est

from matplotlib import rc
rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
## for Palatino and other serif fonts use:
#rc('font',**{'family':'serif','serif':['Palatino']})
rc('text', usetex=True)

Il suffit de choisir votre favori!

Et si vous voulez une police en gras, vous pouvez essayer de \mathbf

plt.title(r'$\mathbf{W_y(\tau, j=3)}$')

Modifier 2

Ce qui suit fera gras police par défaut pour vous

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

rc('font', **font)
12
répondu nye17 2012-07-06 20:13:24