透過 pgf 後端使用 XeLaTeX/LuaLaTeX 進行文字渲染#

使用 pgf 後端,Matplotlib 可以將圖表匯出為 pgf 繪圖命令,這些命令可以使用 pdflatex、xelatex 或 lualatex 處理。XeLaTeX 和 LuaLaTeX 具有完整的 Unicode 支援,可以使用作業系統中安裝的任何字型,並利用 OpenType、AAT 和 Graphite 的進階排版功能。由 plt.savefig('figure.pgf') 建立的 Pgf 圖片可以作為原始命令嵌入到 LaTeX 文件中。透過切換後端,也可以使用 plt.savefig('figure.pdf') 將圖表直接編譯並儲存為 PDF

matplotlib.use('pgf')

或者明確要求使用 pgf 後端

plt.savefig('figure.pdf', backend='pgf')

或者註冊它以處理 pdf 輸出

from matplotlib.backends.backend_pgf import FigureCanvasPgf
matplotlib.backend_bases.register_backend('pdf', FigureCanvasPgf)

最後一種方法允許您繼續使用常規的互動式後端,並從圖形使用者介面儲存 xelatex、lualatex 或 pdflatex 編譯的 PDF 檔案。請注意,在這種情況下,互動式顯示仍然會使用標準的互動式後端(例如,QtAgg),特別是使用 latex 來編譯相關的文字片段。

Matplotlib 的 pgf 支援需要一個包含 TikZ/PGF 套件的最新 LaTeX 安裝(例如 TeXLive),最好安裝 XeLaTeX 或 LuaLaTeX。如果您的系統中存在 pdftocairo 或 ghostscript,則也可以選擇將圖表儲存為 PNG 圖片。所有應用程式的可執行檔必須位於您的 PATH 中。

控制 pgf 後端行為的 rcParams

參數

文件

pgf.preamble

要包含在 LaTeX 前導中的行

pgf.rcfonts

使用 fontspec 套件從 rc 參數設定字型

pgf.texsystem

可以是「xelatex」(預設值)、「lualatex」或「pdflatex」

注意

TeX 定義了一組特殊字元,例如

# $ % & ~ _ ^ \ { }

一般來說,這些字元必須正確逸出。為了方便起見,某些字元(_、^、%)會在數學環境之外自動逸出。其他字元不會逸出,因為它們通常在實際的 TeX 表達式中需要。但是,可以透過自訂前導來設定 TeX 將它們視為「普通」字元(在 TeX 中稱為「catcode 12」),例如

plt.rcParams["pgf.preamble"] = (
    r"\AtBeginDocument{\catcode`\&=12\catcode`\#=12}")

多頁 PDF 檔案#

pgf 後端也支援使用 PdfPages 的多頁 pdf 檔案

from matplotlib.backends.backend_pgf import PdfPages
import matplotlib.pyplot as plt

with PdfPages('multipage.pdf', metadata={'author': 'Me'}) as pdf:

    fig1, ax1 = plt.subplots()
    ax1.plot([1, 5, 3])
    pdf.savefig(fig1)

    fig2, ax2 = plt.subplots()
    ax2.plot([1, 5, 3])
    pdf.savefig(fig2)

字型規格#

用於取得文字元素大小或將圖表編譯為 PDF 時使用的字型通常在 rcParams 中定義。您也可以透過清除 rcParams["font.serif"] (預設值:['DejaVu Serif', 'Bitstream Vera Serif', 'Computer Modern Roman', 'New Century Schoolbook', 'Century Schoolbook L', 'Utopia', 'ITC Bookman', 'Bookman', 'Nimbus Roman No9 L', 'Times New Roman', 'Times', 'Palatino', 'Charter', 'serif'])、rcParams["font.sans-serif"] (預設值:['DejaVu Sans', 'Bitstream Vera Sans', 'Computer Modern Sans Serif', 'Lucida Grande', 'Verdana', 'Geneva', 'Lucid', 'Arial', 'Helvetica', 'Avant Garde', 'sans-serif'])或 rcParams["font.monospace"] (預設值:['DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Computer Modern Typewriter', 'Andale Mono', 'Nimbus Mono L', 'Courier New', 'Courier', 'Fixed', 'Terminal', 'monospace'])的列表來使用 LaTeX 預設的 Computer Modern 字型。請注意,這些字型的字符覆蓋範圍非常有限。如果您想保留 Computer Modern 字體,但需要擴充的 Unicode 支援,請考慮安裝 Computer Modern Unicode 字型 CMU SerifCMU Sans Serif 等。

儲存為 .pgf 時,Matplotlib 用於圖表佈局的字型設定會包含在文字檔的標頭中。

import matplotlib.pyplot as plt

plt.rcParams.update({
    "font.family": "serif",
    # Use LaTeX default serif font.
    "font.serif": [],
    # Use specific cursive fonts.
    "font.cursive": ["Comic Neue", "Comic Sans MS"],
})

fig, ax = plt.subplots(figsize=(4.5, 2.5))

ax.plot(range(5))

ax.text(0.5, 3., "serif")
ax.text(0.5, 2., "monospace", family="monospace")
ax.text(2.5, 2., "sans-serif", family="DejaVu Sans")  # Use specific sans font.
ax.text(2.5, 1., "comic", family="cursive")
ax.set_xlabel("µ is not $\\mu$")

自訂前導#

透過將您自己的命令新增至前導,可以進行完全自訂。如果您想設定數學字型,例如使用 unicode-math,或載入其他套件,請使用 rcParams["pgf.preamble"] (預設值:'')。此外,如果您想自行設定字型,而不是使用 rc 參數中指定的字型,請務必停用 rcParams["pgf.rcfonts"] (預設值:True)。

import matplotlib as mpl

mpl.use("pgf")
import matplotlib.pyplot as plt

plt.rcParams.update({
    "font.family": "serif",  # use serif/main font for text elements
    "text.usetex": True,     # use inline math for ticks
    "pgf.rcfonts": False,    # don't setup fonts from rc parameters
    "pgf.preamble": "\n".join([
         r"\usepackage{url}",            # load additional packages
         r"\usepackage{unicode-math}",   # unicode math setup
         r"\setmainfont{DejaVu Serif}",  # serif font via preamble
    ])
})

fig, ax = plt.subplots(figsize=(4.5, 2.5))

ax.plot(range(5))

ax.set_xlabel("unicode text: я, ψ, €, ü")
ax.set_ylabel(r"\url{https://matplotlib.dev.org.tw}")
ax.legend(["unicode math: $λ=∑_i^∞ μ_i^2$"])

選擇 TeX 系統#

Matplotlib 使用的 TeX 系統由 rcParams["pgf.texsystem"] (預設值:'xelatex')選擇。可能的值為 'xelatex' (預設值)、'lualatex''pdflatex'。請注意,選擇 pdflatex 時,必須在前導中設定字型和 Unicode 處理。

import matplotlib.pyplot as plt

plt.rcParams.update({
    "pgf.texsystem": "pdflatex",
    "pgf.preamble": "\n".join([
         r"\usepackage[utf8x]{inputenc}",
         r"\usepackage[T1]{fontenc}",
         r"\usepackage{cmbright}",
    ]),
})

fig, ax = plt.subplots(figsize=(4.5, 2.5))

ax.plot(range(5))

ax.text(0.5, 3., "serif", family="serif")
ax.text(0.5, 2., "monospace", family="monospace")
ax.text(2.5, 2., "sans-serif", family="sans-serif")
ax.set_xlabel(r"µ is not $\mu$")

疑難排解#

  • 在 Windows 上,可能需要修改 PATH 環境變數,以包含 latex、dvipng 和 ghostscript 可執行檔所在的目錄。有關詳細資訊,請參閱 環境變數在 Windows 中設定環境變數

  • 有時,儲存為 png 圖片的圖表中字型渲染效果非常差。當 pdftocairo 工具不可用且 ghostscript 用於 pdf 到 png 的轉換時,就會發生這種情況。

  • 請確保您嘗試執行的操作在 LaTeX 文件中是可行的、您的 LaTeX 語法有效,並且在必要時使用原始字串以避免意外的逸出序列。

  • rcParams["pgf.preamble"] (預設值:'') 提供了很大的彈性,但也可能導致許多問題。當遇到問題時,請嘗試最小化或停用自訂前導碼。

  • 設定 unicode-math 環境可能會有點棘手。例如,TeXLive 發行版提供了一組數學字型,這些字型通常不會安裝在系統範圍內。與 LuaLaTeX 不同,XeLaTeX 無法透過名稱找到這些字型,這就是為什麼您可能必須指定 \setmathfont{xits-math.otf} 而不是 \setmathfont{XITS Math},或者讓字型可供您的作業系統使用。請參閱此 tex.stackexchange.com 問題以瞭解更多詳細資訊。

  • 如果 Matplotlib 使用的字型配置與您 LaTeX 文件中的字型設定不同,則匯入圖形中的文字元素對齊可能會出現偏差。如果您不確定 Matplotlib 用於佈局的字型,請檢查您的 .pgf 檔案的標頭。

  • 如果圖形中有許多物件,向量圖像(因此 .pgf 檔案)可能會變得臃腫。圖像處理或非常大的散佈圖可能會發生這種情況。在極端情況下,這可能會導致 TeX 記憶體不足:「TeX 容量超出,抱歉」。您可以設定 LaTeX 以增加可用於產生 .pdf 圖像的記憶體量,如 tex.stackexchange.com 上所述。另一種方法是使用 rasterized=True 關鍵字或 .set_rasterized(True) 來「光柵化」導致問題的圖形部分,如 此範例 中所示。

  • 只有在載入相應的字型套件時,才會編譯和呈現各種數學字型。特別是,當在希臘字母上使用 \mathbf{} 時,預設的 computer modern 字型可能不包含它們,在這種情況下,字母不會被呈現。在這種情況下,應載入 lmodern 套件。

  • 如果您仍然需要協助,請參閱 取得協助

由 Sphinx-Gallery 產生的圖庫