2013-04-29 2 views
7

Ich versuche, einige Publikationen in Publikationsqualität zu machen, aber ich habe ein kleines Problem festgestellt. Es scheint standardmäßig, dass Matlotlib-Achsenbeschriftungen und Legendeneinträge schwerer gewichtet sind als die Achsenmarkierungen. Gibt es trotzdem, um die Achsbeschriftungen/Legendeneinträge so zu gewichten, dass sie die gleiche Bedeutung wie die Häkchen haben?Python matplotlib: Ändern Achsenbeschriftungen/Legende von Fett auf Normalgewicht

import matplotlib.pyplot as plt 
import numpy as np 

plt.rc('text',usetex=True) 
font = {'family':'serif','size':16} 
plt.rc('font',**font) 
plt.rc('legend',**{'fontsize':14}) 

x = np.linspace(0,2*np.pi,100) 
y = np.sin(x) 

fig = plt.figure(figsize=(5,5)) 
p1, = plt.plot(x,y) 
p2, = plt.plot(x,x**2) 
plt.xlabel('x-Axis') 
plt.ylabel('y-Axis') 
plt.legend([p1,p2],['Sin(x)','x$^2$']) 
plt.gcf().subplots_adjust(left=0.2) 
plt.gcf().subplots_adjust(bottom=0.15) 
plt.savefig('Test.eps',bbox_inches='tight',format='eps') 
plt.show() 

kann ich Mathe-Modus verwenden, aber das Problem (Ärger) ist, wenn ich einen Satz für ein Label haben, das heißt,

plt.xlabel('$\mathrm{This is the x-axis}$') 

, die sie alle zusammen zerquetscht. Ich kann es mit

plt.xlabel('$\mathrm{This\: is\: the\: x-axis}$') 

beheben, aber das braucht eine Menge Interpunktion. Ich hatte gehofft, dass es etwas gibt, das ich ändern könnte, das es mir erlauben würde, das Format \mathrm{} zu umgehen und das Standard-TeX-Format zu verwenden. Die andere Option, die ich ausprobiert habe, war \text anstelle von \mathrm, aber es scheint, dass der Interpreter von Python dies nicht erkennt, ohne das Paket amsmath zu laden. Ich habe auch versucht:

import matplotlib 
import matplotlib.pyplot as plt 
import numpy as np 

plt.rc('text',usetex=True) 
font = {'family':'serif','size':16} 
plt.rc('font',**font) 
plt.rc('legend',**{'fontsize':14}) 
matplotlib.rcParams['text.latex.preamble']=[r'\usepackage{amsmath}'] 

x = np.linspace(0,2*np.pi,100) 
y = np.sin(x) 

fig = plt.figure(figsize=(5,5)) 
p1, = plt.plot(x,y) 
p2, = plt.plot(x,x**2) 
plt.xlabel(r'$\text{this is the x-Axis}$') 
plt.ylabel('$y-Axis$') 
plt.legend([p1,p2],['Sin(x)','x$^2$']) 
plt.gcf().subplots_adjust(left=0.2) 
plt.gcf().subplots_adjust(bottom=0.15) 
plt.savefig('Test.eps',bbox_inches='tight',format='eps') 
plt.show() 

Dies liefert auch nicht das gewünschte Ergebnis.

Antwort

5

Die andere Antwort bietet eine Lösung für das Problem ... Das Problem ist jedoch sehr spezifisch für Matplotlib und die Implementierung des LateX Backend.

Zunächst ist der rc Parameter, der das Schriftgewicht der Achsenbeschriftungen steuert, 'axes.labelweight', der standardmäßig auf u'normal' festgelegt ist. Dies bedeutet, dass die Etiketten bereits in normalem Gewicht sein sollten.

Der Grund, warum die Schrift kann seine fett erscheint in matplotlib/texmanager.py finden:

  1. Die Schriftfamilie gewählt wird durch 'font.family', den OP im Fall, dann ist dies serif.

  2. Dann wird das Array 'font.<font.family>' (hier: font.serif) ausgewertet, und die Deklaration aller Schriften wird der LateX Präambel hinzugefügt. Zu diesen Erklärungen ist die Linie

    \renewcommand{\rmdefault}{pnc} 
    

    , die den Standard zu New Century School Book which appears to be a bold version of Computer Modern Roman setzt.

Abschließend der kürzeste Weg, um das Problem zu lösen, ist font.serif einzustellen nur Computer Modern Roman zu enthalten:

font = {'family':'serif','size':16, 'serif': ['computer modern roman']} 

Dies hat den zusätzlichen Vorteil, dass es für alle Elemente funktioniert, auch für Etiketten und andere Beschriftungen - ohne schmutzige Tricks mit dem Mathematik-Modus: enter image description here


Hier ist der vollständige Code zum Erzeugen des Plots:

import matplotlib 
import matplotlib.pyplot as plt 
import numpy as np 

plt.rc('text',usetex=True) 
#font = {'family':'serif','size':16} 
font = {'family':'serif','size':16, 'serif': ['computer modern roman']} 
plt.rc('font',**font) 
plt.rc('legend',**{'fontsize':14}) 
matplotlib.rcParams['text.latex.preamble']=[r'\usepackage{amsmath}'] 

x = np.linspace(0,2*np.pi,100) 
y = np.sin(x) 

fig = plt.figure(figsize=(5,5)) 
p1, = plt.plot(x,y) 
p2, = plt.plot(x,x**2) 
plt.xlabel(r'$\text{this is the x-Axis}$') 
plt.ylabel('$y-Axis$') 
plt.legend([p1,p2],['Sin(x)','x$^2$']) 
plt.gcf().subplots_adjust(left=0.2) 
plt.gcf().subplots_adjust(bottom=0.15) 
plt.savefig('Test.eps',bbox_inches='tight',format='eps') 
plt.show() 
+0

Können Sie den Code, den Sie für den Plot verwendet haben, posten? Wenn ich Sie richtig verstehe, wurden alle Beschriftungen (Achse und Legende) ähnlich wie '('label entry')' eingegeben und der einzige Eintrag im Math-Modus war die y-label '('$ y-axis $')'. Wenn das der Fall ist, dann ist dies eine großartige Lösung! – Blink

+0

Die Handlung wurde genau aus Ihrem Code generiert, nur die markierte Zeile wurde geändert! –

+0

@Blink Der Code wurde hinzugefügt ... –

5

Wie wäre:

enter image description here

import matplotlib.pyplot as plt 
import numpy as np 

plt.rc('text',usetex=True) 
font = {'family':'serif','size':16} 
plt.rc('font',**font) 
plt.rc('legend',**{'fontsize':14}) 

x = np.linspace(0,2*np.pi,100) 
y = np.sin(x) 

fig = plt.figure(figsize=(5,5)) 
p1, = plt.plot(x,y) 
p2, = plt.plot(x,x**2) 
plt.xlabel('$\mathrm{This is the }x\mathrm{-axis}$'.replace(' ','\: ')) 
plt.ylabel('$y\mathrm{-axis}$') 
plt.legend([p1,p2],['$\sin(x)$','$x^2$'], loc='best') 
fig.subplots_adjust(left=0.2, bottom=0.15) 
plt.savefig('Test.eps',bbox_inches='tight',format='eps') 
plt.show() 

Dies verwendet

plt.xlabel('$\mathrm{This is the }x\mathrm{-axis}$'.replace(' ','\: ')) 

Räume mit '\: ' zu ersetzen. TeX-Gurus können dem jedoch widersprechen. Sie können fragen, auf TeX stackexchange, wenn es einen besseren Weg gibt.