2014-06-22 13 views
6

Ho una domanda relativa all'utilizzo di TeX in python.Problemi di stile font in lattice che utilizzano amsmath e sfmath per l'etichettatura di plottaggio

Ho i seguenti pacchetti abilitati:

import numpy 
import matplotlib 
import matplotlib.pyplot as plt 

matplotlib.rc('text', usetex = True) 
matplotlib.rc('font', **{'family' : "sans-serif"}) 
params = {'text.latex.preamble' : [r'\usepackage{siunitx}', r'\usepackage{sfmath}']} 
plt.rcParams.update(params) 

La ragione di questo può essere guardato in un previous question di mine.

Tuttavia, ora sarei anche in grado di utilizzare i caratteri del pacchetto amsmath. Quando lo includo in params, non risponde. Tutto ciò di cui ho bisogno è amsmath per è etichettare l'asse x di un grafico con "a".

Quindi, per mostrare ciò che ho:

enter image description here

e quello che voglio (per quanto riguarda l'x-label):

enter image description here

prega di notare che per produrre la seconda immagine , Ho cambiato sfmath in amsmath. Questo incasina immediatamente i tick xey. Questo è qualcosa che non voglio accadere.

È possibile modificare lo stile di carattere di una singola lettera/parola a quello di amsmath? In questo modo sarei in grado di usare solo quello stile di carattere quando si indica l'etichetta x della mia figura.

Un approccio diverso sarebbe quello di sostituire sfmath da amsmath in params e assicurarsi che le zecche assomiglino alla prima immagine.

Grazie

Su un lato nota, le figure sono state create utilizzando:

fig = plt.figure() 

ax1 = fig.add_subplot(1, 1, 1) 
ax1.set_xlabel(r"$a$", fontsize = 14) 

plt.show() 
+0

ottengo tua domanda, ma in per motivarci a trovare una soluzione per te: cosa c'è di sbagliato con le zecche nella seconda foto? –

+0

In questo caso, un errore potrebbe essere un po 'troppo forte. Non mi dispiace il carattere. Il fatto è che a causa di 'usetex = True' tutti i tick sono TeX. Questo rende le zecche più sottili. Senza aumentare le loro dimensioni sarei felice con loro se fossero leggermente più audaci. –

+0

Ho aggiunto una [nuova risposta] (http://stackoverflow.com/a/24432032/1306923) sotto che sembra fare ciò che vuoi. Se non è proprio quello che stai cercando, potresti aggiungere un commento con quello che sembra sbagliato? – tbekolay

risposta

8

Siamo in grado di ottenere esattamente quello che stai cercando per l'utilizzo del secondo approccio: usare amsmath e quindi modificare le ticklabels per essere un tipo di carattere diverso. Questo è più di un hack rispetto ad altre risposte elencate qui, ma ottiene il risultato più vicino.

Il trucco è utilizzare amsmath e lasciare che Matplotlib esegua il rendering come normalmente, quindi alla fine reimposta le etichette con il carattere sans-serif originale. Non sono sicuro se questo sovverte completamente usetex, ma se lo fa, allora hai un mix strano di etichette renderizzate TeX e etichette renderizzate Matplotlib. Che sembra fantastico!

Il pezzo importante del codice è

fontProperties = {'family':'sans-serif', 'weight': 'normal', 'size': 12} 
ax1.set_xticklabels(ax1.get_xticks(), fontProperties) 
ax1.set_yticklabels(ax1.get_yticks(), fontProperties) 

L'aggiunta di questo alla fine del vostro script e aggiungendo amsmath ha pronunciato la seguente:

import numpy 
import matplotlib 
import matplotlib.pyplot as plt 

matplotlib.rc('text', usetex = True) 
matplotlib.rc('font', **{'family' : "sans-serif"}) 
params = {'text.latex.preamble' : [r'\usepackage{siunitx}', r'\usepackage{amsmath}']} 
plt.rcParams.update(params) 

fig = plt.figure(figsize=(8,6)) 
ax1 = fig.add_subplot(1, 1, 1) 
ax1.set_xlabel(r"$a$", fontsize = 14) 

fontProperties = {'family':'sans-serif', 'weight': 'normal', 'size': 12} 
ax1.set_xticklabels(ax1.get_xticks(), fontProperties) 
ax1.set_yticklabels(ax1.get_yticks(), fontProperties) 

Figure

+0

Grazie. Questo è stato esattamente quello che stavo cercando. –

0

ho pensato che tutto ciò non mettere in $ ... $ è reso come testo normale. Quindi avremmo potuto definire in modo indipendente un carattere di testo e un carattere matematico. Tuttavia, le etichette delle zecche sono influenzate dal carattere matematico LaTeX, come mostrato anche nella domanda. Questo è strano, Matplotlib in qualche modo avvolge tutte le etichette di graduazione in un ambiente matematico. Quindi, la sfida fondamentale qui è che le etichette di graduazione e le etichette degli assi vengono visualizzate con gli stessi caratteri. Ora, potremmo incidere su questo facendo uso di più alfabeti matematici. Quindi, dovresti usare qualcosa come \mathrm{} dappertutto.

Tuttavia, il mio assunto è che il problema originale è che non ti piacciono le etichette di graduazione nel carattere Computer Modern. Il mio suggerimento è quindi quello di cambiare il carattere generale in qualcosa di bello, per le etichette di graduazione e le etichette degli assi. Ho trovato Linux Libertine come un tipo di carattere. Non sono sicuro al 100% su come matplotlib avvolga i testi, quindi consiglio di definire il testo e il carattere matematico, entrambi perfettamente compatibili. Questo può essere ottenuto con il pacchetto LaTeX newtx. Con lualatex, il preambolo può essere mantenuto abbastanza pulito per ottenere ciò che vogliamo e utilizziamo uno strumento moderno. Secondo http://matplotlib.org/users/pgf.html, LuaLaTeX è ufficialmente supportato per la produzione di figure PDF tramite il backend PGF.Quindi, questo è il codice che propongo:

import matplotlib as mpl 
mpl.use('pgf') 
import matplotlib.pyplot as plt 

pgf_with_lualatex = { 
    "text.usetex": True, 
    "pgf.rcfonts": False, # Do not set up fonts from rc parameters. 
    "pgf.texsystem": "lualatex", 
    "pgf.preamble": [ 
     r'\usepackage[libertine]{newtxmath}', 
     r'\usepackage[no-math]{fontspec}', 
     r'\usepackage{libertine}', 
     ] 
} 
mpl.rcParams.update(pgf_with_lualatex) 

fig = plt.figure() 
ax1 = fig.add_subplot(1, 1, 1) 
ax1.set_xlabel("$a b c$", fontsize = 14) 
plt.savefig('figure.pdf') 

prendiamo il controllo assoluto sopra i font impostando rcfonts-False, e impostando i caratteri di testo e matematica nel preambolo LaTeX. L'opzione no-math per il pacchetto fontspec è necessaria per consentire a newtxmath di impostare il carattere matematico.

Il PDF prodotto sembra buono, questo è uno screenshot:

enter image description here

+0

Grazie per la risposta. Se utilizzo il tuo codice e confronti l'immagine risultante con la seconda immagine (creata usando 'amsmath'), i segni di spunta sono identici. C'è un modo per renderli più audaci? –

+0

Le zecche non sono identiche. Nella tua seconda immagine sono composti con font Computer Modern, a mia immagine sono in Libertine. –

1

Il pacchetto sfmath ha un'opzione mathitOrig che conserva il carattere originale che sarebbe stato utilizzato per la matematica in corsivo (che è più matematica in LaTeX). L'utilizzo di questa opzione insieme a $\mathit{a}$ ti offre qualcosa di simile a quello che desideri, anche se non è perfetto, in quanto il carattere matematico non è esattamente uguale al font amsmath.

import numpy 
import matplotlib 
import matplotlib.pyplot as plt 

matplotlib.rc('text', usetex = True) 
matplotlib.rc('font', **{'family' : "sans-serif"}) 
params = {'text.latex.preamble' : [r'\usepackage{siunitx}', r'\usepackage[mathitOrig]{sfmath}']} 
plt.rcParams.update(params) 

fig = plt.figure() 
ax1 = fig.add_subplot(1, 1, 1) 
ax1.set_xlabel(r"$\mathit{a}$", fontsize = 14) 

With matitOrig

+0

Grazie per la risposta. Sono consapevole di 'mathitOrig' e ho giocato con esso. Anche con le altre opzioni 'sfmath' ha. Tuttavia, nessuno di loro produce la "a" di cui ho bisogno. –

+0

Quindi, credo che le vostre esigenze non siano chiare. –

Problemi correlati