Matplotlib:LaTeX 示例

日期2017-07-13(最后修改),2006-05-11(创建)

使用 LaTeX 制作出版物图形

本页介绍了几种使用 LaTeX 制作出版物质量图形的方法。

LaTeX 使用 Tex

本节介绍一种遵循 ["Cookbook/Matplotlib/UsingTex"] 指南的技术。

以下是用于包含图形的 LaTeX 文件的概述(例如,用于 APS 物理期刊的 `REVTeX4`,采用两栏格式)。

在 [ ]
\documentclass[prl,10pt,twocolumn]{revtex4}
\usepackage{graphicx}    % Used to import the graphics
\begin{document}
%...
\begin{figure}[t]
  \begin{center}
    \showthe\columnwidth % Use this to determine the width of the figure.
    \includegraphics[width=\columnwidth]{fig1.eps}
    \caption{\label{fig:sin_cos} Plot of the sine and cosine functions.}
  \end{center}
\end{figure}
%...
\end{document}

确定图形大小

第一步是确定图形的大小:这样,当图形被包含时,它不会被调整大小,字体等将完全按照您设置的方式,而不是缩放(并且可能失真)。这可以通过在 LaTeX 中显式设置图形宽度并使用 `\showthe` 命令打印此宽度来完成。(在上面的示例中,图形宽度设置为 `\columnwidth`。)

当文件由 LaTeX 处理时,查看输出。上面的示例产生以下输出(注意:LaTeX 将在 `\showthe` 命令后暂停,按回车键继续)

在 [ ]
This is TeX, Version 3.14159 (Web2C 7.4.5)
LaTeX2e <2001/06/01>
...
> 246.0pt.
l.8     \showthe\columnwidth
                             % Use this to determine the width of the figure.
?
<fig1.eps> [1] (./tst.aux) )
...

因此,图形将为 246.0pt 宽。1 英寸 = 72.27pt(在 [La]TeX 中),这意味着图形宽度应为 3.40390 英寸。高度取决于图形的内容,但可以使用黄金分割来制作令人愉悦的图形。确定后,可以使用 `figure.figsize` 属性设置默认图形大小。

在 [ ]
#!python numbers=disable
fig_width_pt = 246.0  # Get this from LaTeX using \showthe\columnwidth
inches_per_pt = 1.0/72.27               # Convert pt to inches
golden_mean = (sqrt(5)-1.0)/2.0         # Aesthetic ratio
fig_width = fig_width_pt*inches_per_pt  # width in inches
fig_height =fig_width*golden_mean       # height in inches
fig_size = [fig_width,fig_height]

设置字体大小

由于图形不会缩小,因此我们可以明确设置字体大小。

在 [ ]
#!python numbers=disable
          'font.size' : 10,
          'axes.labelsize' : 10,
          'font.size' : 10,
          'text.fontsize' : 10,
          'legend.fontsize': 10,
          'xtick.labelsize' : 8,
          'ytick.labelsize' : 8,

微调

对于这些较小的绘图尺寸,默认边距不足以显示轴标签,因此我们需要指定较大的边距。我们通过显式调用 `axes()` 函数来实现。在本例中,我们只有一个轴。排版后的 LaTeX 文档将在图形两侧留有空白,因此我们不需要将其包含在图形中。因此,我们在顶部和右侧保留少量空白,以确保标签不会超出边界框,并在底部添加更多空间以用于 x 标签

在 [ ]
#!python numbers=disable
pylab.axes([0.125,0.2,0.95-0.125,0.95-0.2])

综合起来

以下是生成绘图的 python 文件。

在 [ ]
#!python
import pylab
from pylab import arange,pi,sin,cos,sqrt
fig_width_pt = 246.0  # Get this from LaTeX using \showthe\columnwidth
inches_per_pt = 1.0/72.27               # Convert pt to inch
golden_mean = (sqrt(5)-1.0)/2.0         # Aesthetic ratio
fig_width = fig_width_pt*inches_per_pt  # width in inches
fig_height = fig_width*golden_mean      # height in inches
fig_size =  [fig_width,fig_height]
params = {'backend': 'ps',
          'axes.labelsize': 10,
          'text.fontsize': 10,
          'legend.fontsize': 10,
          'xtick.labelsize': 8,
          'ytick.labelsize': 8,
          'text.usetex': True,
          'figure.figsize': fig_size}
pylab.rcParams.update(params)
# Generate data
x = pylab.arange(-2*pi,2*pi,0.01)
y1 = sin(x)
y2 = cos(x)
# Plot data
pylab.figure(1)
pylab.clf()
pylab.axes([0.125,0.2,0.95-0.125,0.95-0.2])
pylab.plot(x,y1,'g:',label='$\sin(x)$')
pylab.plot(x,y2,'-b',label='$\cos(x)$')
pylab.xlabel('$x$ (radians)')
pylab.ylabel('$y$')
pylab.legend()
pylab.savefig('fig1.eps')

生成灰度虚线图

一个明显的解决方案是将你的图形转换为灰度,但为了可读性,添加虚线通常更好。这可能在 SigmoidalFunctions 的示例中实现,其中

使用 psfrag 的 LaTeX

注意:本节已过时。最近版本的 matplotlib 中断了 psfrag 功能(例如,参见 此讨论)。也就是说,可以使用 usetex 功能直接渲染 LaTeX 文本,效果很好(如果你仔细选择字体)。我将在不久的将来在这里进一步讨论这个问题。-- MichaelMcNeilForbes

为了确保你的图形使用与文档完全相同的字体,你可以让 LaTeX 使用 psfrag 包生成并替换图形的文本。如果你在使用 `text.usetex` 方法时遇到问题(例如,如果找不到合适的字体),这是一个不错的选择。

为此,只需使用纯文本作为标签,然后使用 psfrag 包替换它们。以下是使用此方法的修改后的文件

在 [ ]
\documentclass[prl,10pt,twocolumn]{revtex4}
\usepackage{graphicx}    % Used to import the graphics
\usepackage{psfrag}
\begin{document}
%...
\begin{figure}[t]
  \begin{center}
    \psfrag{sin(x)}{$\sin(x)$}
    \psfrag{cos(x)}{$\cos(x)$}
    \psfrag{x (radians)}{$x$ (radians)}
    \psfrag{y}{$y$}
    {\footnotesize                  % Replace tick-lables with smaller font.
      \psfrag{1.0}{1.0}
      \psfrag{0.5}{0.5}
      \psfrag{0.0}{0.0}
      \psfrag{-0.5}{-0.5}
      \psfrag{-1.0}{-1.0}
      \psfrag{-8}{-8}
      \psfrag{-6}{-6}
      \psfrag{-4}{-4}
      \psfrag{-2}{-2}
      \psfrag{0}{0}
      \psfrag{2}{2}
      \psfrag{4}{4}
      \psfrag{6}{6}
      \psfrag{8}{8}
      \showthe\columnwidth % Use this to determine the width of the figure.
      \includegraphics[width=\columnwidth]{fig2.eps}
    } % Note that the psfrag commands only work in the top-most environment.
    \caption{\label{fig:sin_cos} Plot of the sine and cosine functions.}
  \end{center}
\end{figure}
%...
\end{document}
在 [ ]
#!python
import pylab
from pylab import arange,pi,sin,cos,sqrt
fig_width_pt = 246.0  # Get this from LaTeX using \showthe\columnwidth
inches_per_pt = 1.0/72.27               # Convert pt to inch
golden_mean = (sqrt(5)-1.0)/2.0         # Aesthetic ratio
fig_width = fig_width_pt*inches_per_pt  # width in inches
fig_height = fig_width*golden_mean      # height in inches
fig_size =  [fig_width,fig_height]
params = {'backend': 'ps',
          'axes.labelsize': 10,
          'text.fontsize': 10,
          'legend.fontsize': 10,
          'xtick.labelsize': 8,
          'ytick.labelsize': 8,
          'text.usetex': False,
          'figure.figsize': fig_size}
pylab.rcParams.update(params)
# Generate data
x = pylab.arange(-2*pi,2*pi,0.01)
y1 = sin(x)
y2 = cos(x)
# Plot data
# Plot data
pylab.figure(1)
pylab.clf()
pylab.axes([0.125,0.2,0.95-0.125,0.95-0.2])
pylab.plot(x,y1,'g:',label='sin(x)')
pylab.plot(x,y2,'-b',label='cos(x)')
pylab.xlabel('x (radians)')
pylab.ylabel('y')
pylab.legend()
pylab.savefig('fig2.eps')

其他事项

另一种在绘制图例后设置图例字体的方法是,例如

在 [ ]
from matplotlib.font_manager import fontManager, FontProperties
font= FontProperties(size='x-small');
pylab.legend(loc=0, prop=font);

-- DavidDonovan

PDF 文件大小

如果您有非常复杂的图像,例如高分辨率等高线图或三维图,将它们保存为 PDF 或 EPS 等矢量图形格式会导致文件大小过大(尽管可以实现惊人的缩放效果)。一种解决方案是选择性地将图表的某些部分(而不是文本标签)转换为光栅图像。这可以通过最近版本的 matplotlib 中的所谓“混合模式渲染”功能来实现。以下是一个示例,它应该可以正常工作

在 [ ]
#!python
from pylab import meshgrid, sin, cos, linspace, contourf, savefig, clf
x, y = meshgrid(*(linspace(-1,1,500),)*2)
z = sin(20*x**2)*cos(30*y)
c = contourf(x,y,z,50)
savefig('full_vector.pdf')
clf()
c = contourf(x,y,z,50,rasterized=True)
savefig('rasterized.pdf')

但是,{{{contourf}}} 目前不支持 {{{rasterized}}} 选项(该选项会被静默忽略)。但是,其他一些绘图元素支持该选项。我正在寻找解决方案。-- MichaelMcNeilForbes

章节作者:MichaelMcNeilForbes,Unknown[100],GaelVaroquaux,Unknown[101],EmmanuelleGouillart,Unknown[102],LaurentPerrinet,Unknown[8],Christian Gagnon

附件