pandas.io.formats.style.Styler.to_latex#

Styler.to_latex(buf=None, *, column_format=None, position=None, position_float=None, hrules=None, clines=None, label=None, caption=None, sparse_index=None, sparse_columns=None, multirow_align=None, multicol_align=None, siunitx=False, environment=None, encoding=None, convert_css=False)[源代码]#

将 Styler 以 LaTeX 格式写入文件、缓冲区或字符串。

在 1.3.0 版本加入.

Parameters:
bufstr, path object, file-like object, or None, default None

实现字符串 write() 函数的字符串、路径对象(实现 os.PathLike[str])或文件类对象。如果为 None,则结果将作为字符串返回。

column_formatbool, default False

位于以下位置的 LaTeX 列规范:

\begin{tabular}{<column_format>}

对于索引列和非数字数据列,默认为 ‘l’;对于数字数据列,默认是 ‘r’,如果 siunitxTrue,则为 ‘S’。

positionbool, default False

位于以下位置的 LaTeX positional 参数(例如 ‘h!’)表格:

\\begin{table}[<position>]

position_float{“centering”, “raggedleft”, “raggedright”},可选

位于以下位置的 LaTeX float 命令:

\begin{table}[<position>]

\<position_float>

如果 environment 是 “longtable”,则无法使用。

hrulesbool

设置为 True 以添加来自 {booktabs} LaTeX 包的 \toprule、\midrule 和 \bottomrule。默认为 pandas.options.styler.latex.hrules,为 False

在 1.4.0 版本发生变更.

clinesbool, default False

用于控制添加用于索引标签分隔的 \cline 命令。可能的值为:

  • None:不添加 cline 命令(默认)。

  • “all;data”:为每个延伸表格宽度的索引值添加一个 cline,包括数据项。

  • “all;index”:同上,但线条仅延伸到索引项的宽度。

  • “skip-last;data”:为除最后一个级别(永远不会稀疏化)之外的每个索引值添加一个 cline,延伸表格的宽度。

  • “skip-last;index”:同上,但线条仅延伸到索引项的宽度。

在 1.4.0 版本加入.

labelbool, default False

包含的 LaTeX 标签为:\label{<label>}。这在主 .tex 文件中使用 \ref{<label>}。

captionstr, tuple,可选

如果是字符串,则 LaTeX 表格标题包含为:\caption{<caption>}。如果是元组,例如 (“full caption”, “short caption”),则标题包含为:\caption[<caption[1]>]{<caption[0]>}。

sparse_indexbool, optional

是否稀疏化多级索引的显示。设置为 False 将为每一行显示每个显式级别的元素。默认为 pandas.options.styler.sparse.index,为 True

sparse_columnsbool, optional

是否稀疏化多级索引的显示。设置为 False 将为每一列显示每个显式级别的元素。默认为 pandas.options.styler.sparse.columns,为 True

multirow_align{“c”, “t”, “b”, “naive”},可选

如果稀疏化多级索引(MultiIndexes),则使用 multirow 包使文本居中、顶部或底部对齐。如果未给出,则默认为 pandas.options.styler.latex.multirow_align,即 “c”。如果给出 “naive”,则渲染时不使用 multirow。

在 1.4.0 版本发生变更.

multicol_align{“r”, “c”, “l”, “naive-l”, “naive-r”},可选

如果稀疏化多级索引列(MultiIndex columns),则使文本靠左、居中或靠右对齐。如果未给出,则默认为 pandas.options.styler.latex.multicol_align,即 “r”。如果给出 naive 选项,则渲染时不使用 multicol。管道修饰符也可以添加到非 naive 值中以绘制垂直规则,例如 “|r” 将在右对齐合并单元格的左侧绘制一条规则。

在 1.4.0 版本发生变更.

siunitxbool,默认 False

设置为 True 以生成与 {siunitx} 包兼容的 LaTeX 结构。

environmentbool, default False

如果给定,则为将替换 \\begin{table} 中的 ‘table’ 的环境。如果指定为 ‘longtable’,则会渲染更合适的模板。如果未给定,则默认为 pandas.options.styler.latex.environment,即 None

在 1.4.0 版本加入.

encodingbool, default False

字符编码设置。默认为 pandas.options.styler.render.encoding,即 “utf-8”。

convert_cssbool,默认 False

将简单的单元格样式从 CSS 转换为 LaTeX 格式。转换表中未找到的任何 CSS 都将被丢弃。可以通过添加选项 –latex 来强制应用样式。请参阅注意事项。

Returns:
str 或 None

如果 buf 为 None,则将结果作为字符串返回。否则返回 None

参见

Styler.format

设置单元格的文本显示值格式。

Notes

LaTeX 包

对于以下功能,我们建议进行以下 LaTeX 包含:

功能

包含

稀疏列

无:包含在默认的 {tabular} 环境中

稀疏行

\usepackage{multirow}

水平线

\usepackage{booktabs}

颜色

\usepackage[table]{xcolor}

siunitx

\usepackage{siunitx}

粗体(与 siunitx 一起使用)

\usepackage{etoolbox}
\robustify\bfseries
\sisetup{detect-all = true} (在 {document} 中)

斜体(与 siunitx 一起使用)

\usepackage{etoolbox}
\robustify\itshape
\sisetup{detect-all = true} (在 {document} 中)

环境

如果参数是 “longtable”,则 \usepackage{longtable} | 或任何其他相关环境包

超链接

\usepackage{hyperref}

单元格样式

LaTeX 样式只能在相应的样式函数使用适当的 LaTeX 命令构建时才能渲染。所有样式功能都围绕 CSS (<attribute>, <value>) 对的概念构建(请参阅 Table Visualization ),这应该被替换为 LaTeX (<command>, <options>) 的方法。每个单元格将使用带有相应选项的嵌套 LaTeX 命令单独设置样式。

例如,以下代码将在 HTML-CSS 中突出显示并加粗单元格:

>>> df = pd.DataFrame([[1,2], [3,4]])
>>> s = df.style.highlight_max(axis=None,
...                            props='background-color:red; font-weight:bold;')
>>> s.to_html()  

仅使用 LaTeX 命令的等效代码如下:

>>> s = df.style.highlight_max(axis=None,
...                            props='cellcolor:{red}; bfseries: ;')
>>> s.to_latex()  

在内部,这些结构化的 LaTeX (<command>, <options>) 对被转换到 display_value 中,其默认结构为:\<command><options> <display_value>。当有多个命令时,后者会被递归嵌套,因此上面示例中被高亮显示的单元格将渲染为 \cellcolor{red} \bfseries 4

有时这种格式不适合应用的命令,或者正在使用的 LaTeX 包的组合,因此可以在元组中的 <options> 中添加额外的标志,以获得所需括号的不同位置(**默认**与 --nowrap 相同):

元组格式

输出结构

(<command>,<options>)

\<command><options> <display_value>

(<command>,<options> --nowrap)

\<command><options> <display_value>

(<command>,<options> --rwrap)

\<command><options>{<display_value>}

(<command>,<options> --wrap)

{\<command><options> <display_value>}

(<command>,<options> --lwrap)

{\<command><options>} <display_value>

(<command>,<options> --dwrap)

{\<command><options>}{<display_value>}

例如,用于控制字重的 textbf 命令应始终与 –rwrap 一起使用,因此 ('textbf', '--rwrap') 将渲染一个有效的单元格,用括号括起来,如 \textbf{<display_value>}

更全面的示例如下:

>>> df = pd.DataFrame([[1, 2.2, "dogs"], [3, 4.4, "cats"], [2, 6.6, "cows"]],
...                   index=["ix1", "ix2", "ix3"],
...                   columns=["Integers", "Floats", "Strings"])
>>> s = df.style.highlight_max(
...     props='cellcolor:[HTML]{FFFF00}; color:{red};'
...           'textit:--rwrap; textbf:--rwrap;'
... )
>>> s.to_latex()  
../../_images/latex_1.png

表格样式

在内部,Styler 使用其 table_styles 对象来解析 column_formatpositionposition_floatlabel 输入参数。这些参数以以下格式添加到表格样式中:

set_table_styles([
    {"selector": "column_format", "props": f":{column_format};"},
    {"selector": "position", "props": f":{position};"},
    {"selector": "position_float", "props": f":{position_float};"},
    {"selector": "label", "props": f":{{{label.replace(':','§')}}};"}
], overwrite=False)

对于 hrules 参数,我们进行了例外处理,该参数实际上同时控制 toprulebottomrulemidrule。除了将 hrules 设置为 True 之外,还可以通过手动设置 table_styles 来设置每个单独的规则定义,例如,我们在下面设置一个常规的 toprule,为 bottomrule 设置一个 hline,并排除 midrule

set_table_styles([
    {'selector': 'toprule', 'props': ':toprule;'},
    {'selector': 'bottomrule', 'props': ':hline;'},
], overwrite=False)

如果向表格样式添加其他 commands,它们将被检测到,并放置在 \\begin{tabular} 命令的正上方。例如,要使用 {colortbl} 包以 \rowcolors{1}{pink}{red} 格式添加奇偶行着色,请使用:

set_table_styles([
    {'selector': 'rowcolors', 'props': ':{1}{pink}{red};'}
], overwrite=False)

这是使用这些参数的更全面的示例:

>>> df.columns = pd.MultiIndex.from_tuples([
...     ("Numeric", "Integers"),
...     ("Numeric", "Floats"),
...     ("Non-Numeric", "Strings")
... ])
>>> df.index = pd.MultiIndex.from_tuples([
...     ("L0", "ix1"), ("L0", "ix2"), ("L1", "ix3")
... ])
>>> s = df.style.highlight_max(
...     props='cellcolor:[HTML]{FFFF00}; color:{red}; itshape:; bfseries:;'
... )
>>> s.to_latex(
...     column_format="rrrrr", position="h", position_float="centering",
...     hrules=True, label="table:5", caption="Styled LaTeX Table",
...     multirow_align="t", multicol_align="r"
... )  
../../_images/latex_2.png

格式化

要格式化值,应在调用 Styler.to_latex 之前使用 Styler.format() ,以及 Styler.hide() 等其他方法,例如:

>>> s.clear()
>>> s.table_styles = []
>>> s.caption = None
>>> s.format({
...    ("Numeric", "Integers"): '\${}',
...    ("Numeric", "Floats"): '{:.3f}',
...    ("Non-Numeric", "Strings"): str.upper
... })  
                Numeric      Non-Numeric
          Integers   Floats    Strings
L0    ix1       $1   2.200      DOGS
      ix2       $3   4.400      CATS
L1    ix3       $2   6.600      COWS
>>> s.to_latex()  
\begin{tabular}{llrrl}
{} & {} & \multicolumn{2}{r}{Numeric} & {Non-Numeric} \\
{} & {} & {Integers} & {Floats} & {Strings} \\
\multirow[c]{2}{*}{L0} & ix1 & \\$1 & 2.200 & DOGS \\
 & ix2 & \$3 & 4.400 & CATS \\
L1 & ix3 & \$2 & 6.600 & COWS \\
\end{tabular}

CSS 转换

此方法可以使用以下有限的转换将使用 HTML-CSS 构建的 Styler 转换为 LaTeX。

CSS 属性

CSS 值

LaTeX 命令

LaTeX 选项

font-weight

bold
bolder
bfseries
bfseries

font-style

italic
oblique
itshape
slshape

background-color

red
#fe01ea
#f0e
rgb(128,255,0)
rgba(128,0,0,0.5)
rgb(25%,255,50%)

cellcolor

{red}–lwrap
[HTML]{FE01EA}–lwrap
[HTML]{FF00EE}–lwrap
[rgb]{0.5,1,0}–lwrap
[rgb]{0.5,0,0}–lwrap
[rgb]{0.25,1,0.5}–lwrap

color

red
#fe01ea
#f0e
rgb(128,255,0)
rgba(128,0,0,0.5)
rgb(25%,255,50%)

color

{red}
[HTML]{FE01EA}
[HTML]{FF00EE}
[rgb]{0.5,1,0}
[rgb]{0.5,0,0}
[rgb]{0.25,1,0.5}

还可以使用 --latex 标志向 HTML-CSS Styler 添加用户定义的仅 LaTeX 样式,并添加转换器将在 CSS 注释中检测到的 LaTeX 解析选项。

>>> df = pd.DataFrame([[1]])
>>> df.style.set_properties(
...     **{"font-weight": "bold /* --dwrap */", "Huge": "--latex--rwrap"}
... ).to_latex(convert_css=True)  
\begin{tabular}{lr}
{} & {0} \\
0 & {\bfseries}{\Huge{1}} \\
\end{tabular}

Examples

下面我们给出一个完整的循序渐进的示例,添加一些高级功能并注意一些常见的陷阱。

首先,我们像往常一样创建 DataFrame 和 Styler,包括 MultiIndex 行和列,这允许更高级的格式选项:

>>> cidx = pd.MultiIndex.from_arrays([
...     ["Equity", "Equity", "Equity", "Equity",
...      "Stats", "Stats", "Stats", "Stats", "Rating"],
...     ["Energy", "Energy", "Consumer", "Consumer", "", "", "", "", ""],
...     ["BP", "Shell", "H&M", "Unilever",
...      "Std Dev", "Variance", "52w High", "52w Low", ""]
... ])
>>> iidx = pd.MultiIndex.from_arrays([
...     ["Equity", "Equity", "Equity", "Equity"],
...     ["Energy", "Energy", "Consumer", "Consumer"],
...     ["BP", "Shell", "H&M", "Unilever"]
... ])
>>> styler = pd.DataFrame([
...     [1, 0.8, 0.66, 0.72, 32.1678, 32.1678**2, 335.12, 240.89, "Buy"],
...     [0.8, 1.0, 0.69, 0.79, 1.876, 1.876**2, 14.12, 19.78, "Hold"],
...     [0.66, 0.69, 1.0, 0.86, 7, 7**2, 210.9, 140.6, "Buy"],
...     [0.72, 0.79, 0.86, 1.0, 213.76, 213.76**2, 2807, 3678, "Sell"],
... ], columns=cidx, index=iidx).style

其次,我们将格式化显示,并且由于我们的表格相当宽,我们将隐藏索引的重复级别 0:

>>> (styler.format(subset="Equity", precision=2)
...       .format(subset="Stats", precision=1, thousands=",")
...       .format(subset="Rating", formatter=str.upper)
...       .format_index(escape="latex", axis=1)
...       .format_index(escape="latex", axis=0)
...       .hide(level=0, axis=0))  

请注意,索引和列标题的字符串条目之一是“H&M”。如果不将 escape=”latex” 选项应用于 format_index 方法,生成的 LaTeX 将无法呈现,并且返回的错误非常难以调试。使用适当的转义符,“&”被转换为“\&”。

第三,我们将应用一些(CSS-HTML)样式到我们的对象。我们将使用一个内置方法,并定义我们自己的方法来突出股票推荐:

>>> def rating_color(v):
...     if v == "Buy": color = "#33ff85"
...     elif v == "Sell": color = "#ff5933"
...     else: color = "#ffdd33"
...     return f"color: {color}; font-weight: bold;"
>>> (styler.background_gradient(cmap="inferno", subset="Equity", vmin=0, vmax=1)
...       .map(rating_color, subset="Rating"))  

所有上述样式都将在 HTML(见下文)和 LaTeX 转换后正常工作:

../../_images/latex_stocks_html.png

然而,我们最终想添加一个仅限 LaTeX 的样式(来自 {graphicx} 包),这个样式不容易从 CSS 转换,并且 pandas 也不支持。请注意这里使用的 –latex 标志,以及 –rwrap 以确保其格式正确且在转换时不会被忽略。

>>> styler.map_index(
...     lambda v: "rotatebox:{45}--rwrap--latex;", level=2, axis=1
... )  

最后,我们渲染我们的 LaTeX,并根据需要添加其他选项:

>>> styler.to_latex(
...     caption="Selected stock correlation and simple statistics.",
...     clines="skip-last;data",
...     convert_css=True,
...     position_float="centering",
...     multicol_align="|c|",
...     hrules=True,
... )  
\begin{table}
\centering
\caption{Selected stock correlation and simple statistics.}
\begin{tabular}{llrrrrrrrrl}
\toprule
 &  & \multicolumn{4}{|c|}{Equity} & \multicolumn{4}{|c|}{Stats} & Rating \\
 &  & \multicolumn{2}{|c|}{Energy} & \multicolumn{2}{|c|}{Consumer} &
\multicolumn{4}{|c|}{} &  \\
 &  & \rotatebox{45}{BP} & \rotatebox{45}{Shell} & \rotatebox{45}{H\&M} &
\rotatebox{45}{Unilever} & \rotatebox{45}{Std Dev} & \rotatebox{45}{Variance} &
\rotatebox{45}{52w High} & \rotatebox{45}{52w Low} & \rotatebox{45}{} \\
\midrule
\multirow[c]{2}{*}{Energy} & BP & {\cellcolor[HTML]{FCFFA4}}
\color[HTML]{000000} 1.00 & {\cellcolor[HTML]{FCA50A}} \color[HTML]{000000}
0.80 & {\cellcolor[HTML]{EB6628}} \color[HTML]{F1F1F1} 0.66 &
{\cellcolor[HTML]{F68013}} \color[HTML]{F1F1F1} 0.72 & 32.2 & 1,034.8 & 335.1
& 240.9 & \color[HTML]{33FF85} \bfseries BUY \\
 & Shell & {\cellcolor[HTML]{FCA50A}} \color[HTML]{000000} 0.80 &
{\cellcolor[HTML]{FCFFA4}} \color[HTML]{000000} 1.00 &
{\cellcolor[HTML]{F1731D}} \color[HTML]{F1F1F1} 0.69 &
{\cellcolor[HTML]{FCA108}} \color[HTML]{000000} 0.79 & 1.9 & 3.5 & 14.1 &
19.8 & \color[HTML]{FFDD33} \bfseries HOLD \\
\cline{1-11}
\multirow[c]{2}{*}{Consumer} & H\&M & {\cellcolor[HTML]{EB6628}}
\color[HTML]{F1F1F1} 0.66 & {\cellcolor[HTML]{F1731D}} \color[HTML]{F1F1F1}
0.69 & {\cellcolor[HTML]{FCFFA4}} \color[HTML]{000000} 1.00 &
{\cellcolor[HTML]{FAC42A}} \color[HTML]{000000} 0.86 & 7.0 & 49.0 & 210.9 &
140.6 & \color[HTML]{33FF85} \bfseries BUY \\
 & Unilever & {\cellcolor[HTML]{F68013}} \color[HTML]{F1F1F1} 0.72 &
{\cellcolor[HTML]{FCA108}} \color[HTML]{000000} 0.79 &
{\cellcolor[HTML]{FAC42A}} \color[HTML]{000000} 0.86 &
{\cellcolor[HTML]{FCFFA4}} \color[HTML]{000000} 1.00 & 213.8 & 45,693.3 &
2,807.0 & 3,678.0 & \color[HTML]{FF5933} \bfseries SELL \\
\cline{1-11}
\bottomrule
\end{tabular}
\end{table}
../../_images/latex_stocks.png