2013-04-29 14 views
7

Próbuję utworzyć fabułę o jakości publikacji, ale napotkałem mały problem. Wydaje się domyślnie, że etykiety osi i etykiet w matplotlib są ważone cięższe niż znaki podziałki osi. Czy mimo to należy wymusić, aby etykiety osi/legendy miały taki sam ciężar, jak znaki podziałki?Python matplotlib: Zmień etykiety osi/legendę na pogrubioną na zwykłą wagę

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

mogę używać trybu matematycznego, ale problem (kłopot) jest, gdy mam zdanie na etykiecie, to znaczy

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

który squishes to wszystko razem. Mogę to naprawić, korzystając z

, ale wymaga to dużej liczby znaków interpunkcyjnych. Miałem nadzieję, że jest coś, co mógłbym zmienić, co pozwoliłoby mi obejść format \mathrm{} i użyć standardowego formatu TeX.

Inną opcją, której próbowałem, było użycie \text zamiast \mathrm, ale wygląda na to, że interpreter języka Python tego nie rozpoznaje bez załadowania pakietu amms. Próbowałem również:

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

Nie zwraca to pożądanego rezultatu.

Odpowiedz

5

Inna odpowiedź zapewnia obejście problemu ... Jednak problem jest bardzo specyficzny dla matplotlib i implementacji zaplecza LateX.

Po pierwsze, parametr rc kontrolujący wagę czcionki etykiet osi to 'axes.labelweight', który domyślnie jest ustawiony na u'normal'. Oznacza to, że etykiety powinny już być w zwykłej wadze.

Powodem czcionka wydaje się być pogrubione można znaleźć w matplotlib/texmanager.py:

  1. Rodzina czcionki jest wybierany przez 'font.family', w przypadku PO, to serif.

  2. Następnie przetwarzana jest tablica 'font.<font.family>' (tutaj: font.serif), a deklaracja wszystkich czcionek jest dodawana do preambuły LateX. Wśród tych zgłoszeń jest linia

    \renewcommand{\rmdefault}{pnc} 
    

    która ustawia domyślne New Century School Book which appears to be a bold version of Computer Modern Roman.

Podsumowując, najkrótsza droga do rozwiązania problemu jest ustawienie font.serif zawierają tylko Computer Modern Roman:

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

Ma to tę dodatkową zaletę, że działa dla wszystkich elementów, nawet dla etykiet i innych podpisów - bez brudnych sztuczek z wykorzystaniem trybu Matematyka: enter image description here


Oto kompletny kod do wygenerowania wykresu:

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

Czy możesz wpisać kod, którego użyłeś na działce? Jeśli dobrze cię rozumiem, wszystkie etykiety (oś i legenda) zostały napisane podobnie jak "(" etykieta "), a jedynym wpisem w trybie matematycznym była etykieta" y "(" oś $ y "). Jeśli tak jest, to jest to świetne rozwiązanie! – Blink

+0

Wykres został wygenerowany dokładnie z Twojego kodu, zmieniono tylko podświetloną linię! –

+0

@Blink Dodano kod ... –

5

Jak o:

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

używa

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

zastąpić spacje z '\: '. Guru TeX mogą się temu sprzeciwić. Możesz zapytać na TeX stackexchange, czy jest lepszy sposób.

Powiązane problemy