Matplotlib:LaTeX 示例¶
日期 | 2017-07-13(最后修改),2006-05-11(创建) |
---|
\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
附件