2014-06-22 7 views
6

Ich habe eine Frage zur Verwendung von TeX in Python.Latex-Schriftart Probleme mit amsmath und sfmath für Plot-Labeling

Ich habe folgende Pakete aktiviert:

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) 

Der Grund dafür in einem previous question von mir nachgeschlagen werden kann.

Allerdings könnte ich nun auch die Fonts des amsmath Pakets verwenden. Wenn ich es in Params einfüge, reagiert es nicht. Alles, was ich benötige, ist amsmath, um die x-Achse eines Plots mit "a" zu beschriften.

So Ihnen zu zeigen, was ich habe:

enter image description here

und was ich will (in Bezug auf die x-label):

enter image description here

Bitte beachten Sie, dass das zweite Bild zu erzeugen Ich habe sfmath in amsmath geändert. Dies verwirrt sofort die X- und Y-Zecken. Das ist etwas, was ich nicht passieren möchte.

Ist es vielleicht möglich, den Schriftstil eines einzelnen Buchstabens/Wortes zu dem von amsmath zu ändern? Auf diese Weise könnte ich nur diesen Schriftstil verwenden, wenn ich das X-Label meiner Figur anzeige.

Ein anderer Ansatz wäre, sfmath durch amsmath in params zu ersetzen und sicherzustellen, dass die Ticks wie das erste Bild aussehen.

Dank

Auf einer Seite zur Kenntnis wurden die Zahlen mit erstellt:

fig = plt.figure() 

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

plt.show() 
+0

ich Ihre Frage, aber in um uns zu motivieren, eine Lösung für Sie zu finden: Was stimmt mit den Zecken im zweiten Bild nicht? –

+0

Falsch könnte in diesem Fall etwas zu stark sein. Die Schrift macht mir nichts aus. Die Sache ist jedoch, dass wegen "Usetex = True" alle Ticks TeX sind. Dies macht die Zecken dünner. Ohne ihre Größe zu vergrößern, wäre ich mit ihnen einverstanden, wenn sie etwas mutiger wären. –

+0

Ich fügte eine [neue Antwort] (http://stackoverflow.com/a/24432032/1306923) darunter hinzu, die scheint zu tun, was Sie wollen. Wenn es nicht ganz das ist, wonach Sie suchen, könnten Sie einen Kommentar hinzufügen, was falsch aussieht? – tbekolay

Antwort

8

Wir können genau das erreichen, was Sie sich für Ihren zweiten Ansatz freuen: amsmath verwenden und dann die ticklabels ändern eine andere Schriftart zu sein. Dies ist mehr ein Hack als andere Antworten hier aufgelistet, aber es erreicht am besten, was Sie wollen.

Der Trick besteht darin, amsmath zu verwenden und Matplotlib alles wie gewohnt rendern zu lassen, und dann am Ende die Teilstrichbeschriftungen mit der ursprünglichen Sans-Serif-Schriftart zurückzusetzen. Ich bin mir nicht sicher, ob das usetex komplett unterwandert, aber wenn es das tut, dann haben Sie eine seltsame Mischung aus TeX gerenderten Etiketten und Matplotlib gerenderten Etiketten. Was sieht gut aus!

Der wichtige Teil des Codes ist

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

dies von Ihrem Skript zu Ende Hinzufügen und das Hinzufügen von amsmath ergibt folgendes:

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

Danke. Das war genau das, wonach ich gesucht habe. –

0

Ich dachte, dass alles nicht put in $ ... $ als normaler Text dargestellt wird. Dann hätten wir einfach eine Text- und eine Mathematikschrift selbst definieren können. Die Tick-Beschriftungen werden jedoch von der LaTeX-Matheschriftart beeinflusst, wie auch in Ihrer Frage gezeigt. Das ist merkwürdig, Matplotlib umschließt irgendwie alle Tickbeschriftungen in einer mathematischen Umgebung. Daher besteht die grundlegende Herausforderung darin, dass die Tick-Labels und die Achsenbeschriftungen mit den gleichen Schriften gerendert werden. Nun konnten wir das umgehen, indem wir mehrere mathematische Alphabete benutzten. Dann müssten Sie etwas wie \mathrm{} überall verwenden.

Allerdings ist meine Annahme, dass das ursprüngliche Problem ist, dass Sie die Tick-Etiketten in Computer Modern Schriftart nicht mögen. Mein Vorschlag ist daher, die Gesamtschriftart in etwas zu ändern, das gut aussieht, sowohl für die Tickbeschriftungen als auch für die Achsenbeschriftungen. Ich habe festgestellt, dass Linux Libertine eine solche Schriftart ist. Ich bin mir nicht 100% ig sicher, wie matplotlib die Texte umschließt, deshalb empfehle ich, sowohl Text als auch mathematische Schrift zu definieren, die beide gut zusammenpassen. Dies kann mit dem LaTeX-Paket erreicht werden. Mit lualatex kann die Präambel ziemlich sauber gehalten werden, um zu erreichen, was wir wollen, und wir verwenden ein modernes Werkzeug. Gemäß http://matplotlib.org/users/pgf.html wird LuaLaTeX offiziell unterstützt, um PDF-Abbildungen über das PGF-Backend zu erstellen.Also, das ist der Code, den ich vorschlagen:

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

Wir nehmen die absolute Kontrolle über die Schriften von rcfonts-False Einstellung und durch Text und mathematische Schriften in der LaTeX Präambel Einstellung. Die no-math Option zu dem fontspec Paket ist erforderlich, um newtxmath die mathematische Schriftart festlegen zu lassen.

Die erzeugte PDF sieht gut aus, ist dies ein Screenshot:

enter image description here

+0

Danke für Ihre Antwort. Wenn ich Ihren Code verwende und das resultierende Bild mit dem zweiten Bild (erstellt mit 'amsmath') vergleiche, sind die Ticks identisch. Gibt es eine Möglichkeit, sie mutiger zu machen? –

+0

Die Ticks sind nicht identisch. In Ihrem zweiten Bild sind sie mit Computer Modern Schriftart gesetzt, in meinem Bild sind sie in Libertine. –

1

Das sfmath Paket hat eine Option mathitOrig, die die ursprüngliche Schriftart behält, die in Kursivschrift für Mathematik verwendet werden würde (was die meisten Mathematik ist in Latex). Wenn Sie diese Option zusammen mit $\mathit{a}$ verwenden, erhalten Sie etwas, das Ihren Wünschen sehr nahe kommt, auch wenn es nicht perfekt ist, da die mathematische Schriftart nicht ganz der Schriftart amsmath entspricht.

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

Danke für Ihre Antwort. Ich kenne "MathitOrig" und habe damit herumgespielt. Auch mit den anderen Optionen hat 'sfmath'. Keine von ihnen produziert jedoch das "a", das ich benötige. –

+0

Dann, ich denke, Ihre Anforderungen sind unklar. –