2014-06-22 24 views
6

我有一個在python中使用TeX的問題。使用amsmath和sfmath進行繪圖標記的乳膠字體樣式問題

我啓用了以下軟件包:

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) 

這樣做的原因可以在我的previous question進行查找。

但是,我現在也可以使用amsmath包的字體。當我將它包含在params中時,它沒有迴應。我需要的所有amsmath是用「a」標記圖的X軸。

所以告訴你我有什麼:

enter image description here

,我想(關於X標記)什麼:

enter image description here

請注意,以產生第二圖像,我將sfmath更改爲amsmath。這立即擾亂了x和y蜱。這是我不想發生的事情。

是否可以將單個字母/單詞的字體樣式更改爲amsmath的字體樣式?通過這種方式,我只能在指出圖形的x標籤時才能使用該字體樣式。

另一種方法是用amsmath替換sfmathparams並確保刻度看起來像第一張圖片。

感謝

在一個側面說明,使用創建的人物:

fig = plt.figure() 

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

plt.show() 
+0

我明白你的問題,但在爲了激勵我們爲您找到解決方案:第二張圖片中的蜱有什麼問題? –

+0

在這種情況下,錯誤可能有點過強。我不介意字體。但是,由於'usetex = True',所有的tick都是TeX。這使得蜱更薄。如果不增加它們的大小,如果它們稍微大一點,我會對它們保持謹慎。 –

+0

我在下面添加了一個[新答案](http://stackoverflow.com/a/24432032/1306923),看起來是做你想做的。如果它不是你想要的,你可以添加一個評論,看看有什麼不對嗎? – tbekolay

回答

8

我們可以實現你在尋找什麼使用第二種方法:使用amsmath,然後更改ticklabels是不同的字體。這比其他在這裏列出的答案更具破壞性,但它最接近你實現的目標。

訣竅是使用amsmath並讓Matplotlib渲染所有東西,然後在最後使用原始sans-serif字體重置刻度標籤。我不確定這是否完全顛覆了usetex,但如果它確實如此,那麼您有TeX渲染標籤和Matplotlib渲染標籤的奇怪組合。這看起來不錯!

代碼的重要部分是

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

添加以下內容到腳本的末尾並添加amsmath給出如下:

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

謝謝。這正是我一直在尋找的。 –

0

我以爲一切投產$ ... $呈現爲普通文本。然後我們可以獨立地定義文本字體和數學字體。但是,滴答標籤會受到LaTeX數學字體的影響,也如您的問題所示。這很奇怪,matplotlib以某種方式將所有刻度標籤包裝在數學環境中。因此,這裏的基本挑戰是刻度標籤以及軸標籤都使用相同的字體進行渲染。現在,我們可以利用多個數學字母來解決這個問題。然後,你將不得不在整個地方使用類似\mathrm{}的東西。

但是,我的假設是,原來的問題是,你不喜歡Computer Modern字體中的刻度標籤。因此,我的建議是將整體字體更改爲看起來很棒的字體,以及刻度標籤和軸標籤。我發現Linux Libertine是這樣一種字體。我不是100%確定matplotlib如何包裝文本,因此我建議定義文本以及數學字體,兩者很好地吻合。這可以通過乳膠包裝newtx來實現。 lualatex,序言可以保持相當乾淨,以實現我們想要的,我們使用現代工具。根據http://matplotlib.org/users/pgf.html,LuaLaTeX正式支持通過PGF後端製作PDF數字。所以,這是我提出的代碼:

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

我們採取通過設置rcfontsFalse,並通過在序言的LaTeX設置文本和數學字體在字體的絕對控制權。 fontspec包需要no-math選項才能讓newtxmath設置數學字體。

產生的PDF看起來不錯,這是截圖:

enter image description here

+0

感謝您的回答。如果我使用您的代碼並將結果圖像與第二張圖像(使用'amsmath'創建)進行比較,則標記是相同的。有沒有辦法讓他們更大膽? –

+0

滴答不一樣。在第二張圖片中,他們使用Computer Modern字體排版,在我的圖片中,他們位於Libertine。 –

1

sfmath包有哪些保留,將斜體用於數學(這是大多數數學原始字體選項mathitOrig膠乳)。使用此選項以及$\mathit{a}$可以爲您提供一些與您想要的內容相近的內容,儘管它並不完美,因爲數學字體與amsmath字體不完全相同。

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

感謝您的回答。我知道'mathitOrig'並一直在玩它。還有其他選項'sfmath'。但是,它們都不會產生我需要的「a」。 –

+0

然後,我想你的要求不清楚。 –