2013-04-29 169 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() 

私は数学モードを使用することができますが、私はラベルのための文を持っているときに問題(迷惑)は、ある、すなわち、それをすべて一緒squishes

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

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

を使用して修正することができますが、多くの句読点が必要です。 \mathrm{}形式をバイパスして標準のTeX形式を使用できるように変更できるものがあることを期待していました。

私が試したもう一つの選択肢は、\mathrmではなく\textでしたが、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バックエンドの実装に非常に特有です。

まず、軸ラベルのフォントの太さを制御するパラメータは'axes.labelweight'であり、デフォルトでu'normal'に設定されています。これは、ラベルがすでに通常の重量でであることを意味します。

フォントを太字ように見える理由はmatplotlib/texmanager.pyで見つけることができます:

  1. フォントファミリは、OPの場合には、'font.family'によって選択され、これはserifです。

  2. 次に、配列'font.<font.family>'(ここではfont.serif)が評価され、すべてのフォントの宣言がLateXプリアンブルに追加されます。これらの宣言の中で新世紀の学校ブックwhich appears to be a bold version of Computer Modern Romanにデフォルトを設定する行

    \renewcommand{\rmdefault}{pnc} 
    

    です。

は結論として、この問題を解決するための最短の方法は、唯一のコンピュータの近代ローマを含むようにfont.serifを設定することです:

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

これは、それも、すべて要素のために働くという付加的な利点を持っています enter image description here


:数式モードを使用して汚い手口なし - ラベルや他のキャプションの10

プロットを生成するコードは次のとおりです。

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

プロットに使用したコードを投稿できますか?私があなたを正しく理解していれば、すべてのラベル(軸と凡例)は '( 'ラベルエントリ')'と同様にタイプされ、唯一の数式モードエントリはyラベル '( '$ y軸$')'でした。それが事実なら、これは素晴らしい解決策です! – Blink

+0

プロットはコードから正確に生成され、強調表示された行だけが変更されました! –

+0

@Blinkコードを追加しました... –

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にお尋ねしてください。

関連する問題