2013-04-29 270 views
7

我試圖製作一些出版質量的圖,但遇到了一個小問題。默認情況下,matplotlib軸標籤和圖例條目的權重比軸刻度標記更重。無論如何強制軸標籤/圖例條目與刻度標記的權重相同嗎?python 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}) 

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

我可以用數學模式,但問題(煩惱)是當我有一個句子的標籤,即

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

這squishes它一起。我可以通過使用

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

但這需要大量的標點符號。我希望有一些我可以改變的東西,這將允許我繞過\mathrm{}格式,並使用標準的TeX格式。

我試過的另一個選項是使用\text而不是\mathrm,但似乎Python的解釋程序在不加載程序包amsmath的情況下無法識別此問題。我也嘗試過:

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

這也不會返回所需的結果。

回答

5

另一個答案提供了一個解決問題的辦法......但是,問題是非常具體的matplotlib和LateX後端的實現。

首先,控制軸標籤字體權重的rc參數爲'axes.labelweight',默認設置爲u'normal'。這意味着標籤的重量應該已經是

爲什麼字體似乎是大膽的原因可以在matplotlib/texmanager.py發現:

  1. 字體系列由'font.family'選擇,在OP的情況下,這是serif

  2. 然後,對數組'font.<font.family>'(這裏:font.serif)進行評估,並將所有字體的聲明添加到LateX前導碼。在這些聲明是該行

    \renewcommand{\rmdefault}{pnc} 
    

    它設置默認爲新世紀學校圖書which appears to be a bold version of Computer Modern Roman

總之,解決問題的最簡單的辦法是設置font.serif只包含現代計算機羅馬:

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

這具有適用於所有元素,甚至是額外的好處對於標籤和其他標題 - 不使用數學模式的骯髒技巧: enter image description here


下面是生成劇情的完整代碼:

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

您可以發佈您用於劇情的代碼嗎?如果我理解正確,所有標籤(軸和圖​​例)的輸入與'('label entry')'類似,唯一的數學模式輸入是y標籤'('$ y-axis $')'。如果是這樣的話,那麼這是一個很好的解決方案! – Blink 2015-06-09 12:04:55

+0

該圖是從您的代碼中精確生成的,只有突出顯示的行已更改! – 2015-06-09 12:32:40

+0

@Blink添加代碼... – 2015-06-09 12:34:26

5

如何:

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

它使用

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

'\: '來代替空格。然而,TeX大師可能會反對這一點。如果有更好的方法,你可以詢問TeX stackexchange

相關問題