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。
Added in version 1.3.0.
- 参数:
- bufstr, 路径对象, 类文件对象, 或 None, 默认 None
字符串、路径对象(实现
os.PathLike[str]
),或实现字符串write()
函数的类文件对象。如果为 None,结果将作为字符串返回。- column_formatstr, 可选
LaTeX 列规范放置在位置:
begin{tabular}{<column_format>}
默认为索引和非数字数据列的 ‘l’,对于数字数据列,默认为 ‘r’,如果
siunitx
为True
,则为 ‘S’。- 位置str, 可选
LaTeX 的位置参数(例如 ‘h!’)用于表格,放置在位置:
\begin{table}[<position>]
.- position_float{“centering”, “raggedleft”, “raggedright”}, 可选
LaTeX 浮动命令放置在位置:
begin{table}[<position>]
<position_float>
不能在
environment
为 “longtable” 时使用。- hrulesbool
设置为 True 以添加来自 {booktabs} LaTeX 包的 toprule, midrule 和 bottomrule。默认为
pandas.options.styler.latex.hrules
,即 False。在 1.4.0 版本发生变更.
- clinesstr, 可选
用于控制为索引标签分离添加 cline 命令。可能的值有:
None: 不添加cline命令(默认)。
“all;data”:为每个索引值添加一行,扩展表格的宽度,包括数据条目。
“all;index”:如上所述,线条仅延伸到索引条目的宽度。
“skip-last;data”: 除了最后一级(永远不会被稀疏化),每个索引值都会添加一行,扩展表格的宽度。
“skip-last;index”:如上所述,线条仅延伸到索引条目的宽度。
Added in version 1.4.0.
- 标签str, 可选
包含的 LaTeX 标签为:label{<label>}。这在主 .tex 文件中与 ref{<label>} 一起使用。
- 标题str, 元组, 可选
如果是字符串,LaTeX 表格标题包含为:caption{<caption>}。如果是元组,即 (“完整标题”, “简短标题”),标题包含为:caption[<caption[1]>]{<caption[0]>}。
- sparse_index布尔值, 可选
是否稀疏显示分层索引。设置为 False 将显示分层键中每一行的每个显式级别元素。默认为
pandas.options.styler.sparse.index
,即 True。- sparse_columns布尔值, 可选
是否稀疏显示分层索引。设置为 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列,是否将文本左对齐、居中对齐或右对齐。如果未指定,默认为``pandas.options.styler.latex.multicol_align``,即“r”。如果给出一个简单的选项,则不使用multicol渲染。管道装饰器也可以添加到非简单值中以绘制垂直规则,例如“|r”将在右对齐的合并单元格左侧绘制一条规则。
在 1.4.0 版本发生变更.
- siunitxbool, 默认 False
设置为
True
以使 LaTeX 兼容 {siunitx} 包。- 环境str, 可选
如果指定,将替换
\begin{table}
中的 ‘table’ 环境。如果指定 ‘longtable’,则渲染更合适的模板。如果未指定,则默认为pandas.options.styler.latex.environment
,即 None。Added in version 1.4.0.
- 编码str, 可选
字符编码设置。默认为
pandas.options.styler.render.encoding
,即“utf-8”。- convert_cssbool, 默认 False
将简单的单元格样式从CSS转换为LaTeX格式。任何在转换表中找不到的CSS都会被丢弃。可以通过添加选项 –latex 来强制使用样式。请参阅注释。
- 返回:
- str 或 None
如果 buf 是 None,则以字符串形式返回结果。否则返回 None。
参见
Styler.format
格式化单元格的文本显示值。
备注
Latex 包
对于以下功能,我们推荐以下 LaTeX 包含:
功能
包含
稀疏列
none: 包含在默认的 {tabular} 环境中
稀疏行
\usepackage{multirow}
hrules
\usepackage{booktabs}
颜色
usepackage[table]{xcolor}
siunitx
\usepackage{siunitx}
粗体(使用 siunitx)
\usepackage{etoolbox}robustifybfseriessisetup{detect-all = true} (在 {document} 内)斜体 (使用 siunitx)
\usepackage{etoolbox}robustifyitshapesisetup{detect-all = true} (在 {document} 内)environment
usepackage{longtable} 如果参数是 “longtable” | 或任何其他相关环境包
超链接
usepackage{hyperref}
单元格样式
LaTeX 样式只有在伴随的样式函数使用适当的 LaTeX 命令构建时才能呈现。所有样式功能都是围绕 CSS
(<属性>, <值>)
对的概念构建的(参见 表格可视化),这应该被 LaTeX(<命令>, <选项>)
方法所取代。每个单元格将使用嵌套的 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
(<命令>, <选项>)
对被翻译为带有默认结构的display_value
:\<命令><选项> <display_value>
。在有多个命令的情况下,后者会递归嵌套,因此上述示例突出显示的单元格呈现为\cellcolor{red} \bfseries 4
。偶尔这种格式不适合所应用的命令,或正在使用的 LaTeX 包的组合,因此可以在元组内的
<options>
中添加额外的标志,以产生所需括号的不同位置(默认 与--nowrap
相同):Tuple 格式
输出结构
(<命令>,<选项>)
<命令><选项> <显示值>
(<命令>,<选项>
--nowrap
)<命令><选项> <显示值>
(<命令>,<选项>
--rwrap
)<命令><选项>{<显示值>}
(<命令>,<选项>
--wrap
){<command><options> <display_value>}
(<命令>,<选项>
--lwrap
){<command><options>} <display_value>
(<command>,<options>
--dwrap
){<command><options>}{<display_value>}
例如,用于字体粗细的 textbf 命令应始终与 –rwrap 一起使用,因此
('textbf', '--rwrap')
将渲染一个带有大括号的工作单元格,如 `` extbf{<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()
表格样式
内部 Styler 使用其
table_styles
对象来解析column_format
、position
、position_float
和label
输入参数。这些参数以以下格式添加到表格样式中: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
参数,实际上它同时控制着三个命令:toprule
、bottomrule
和midrule
。与其将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} 包中,格式为 `` owcolors{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" ... )
格式化
在调用 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
boldbolderbfseries
bfseries
font-style
italicobliqueitshape
slshape
background-color
红#fe01ea#f0ergb(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颜色
红#fe01ea#f0ergb(128,255,0)rgba(128,0,0,0.5)rgb(25%,255,50%)颜色
{red}[HTML]{FE01EA}[HTML]{FF00EE}[rgb]{0.5,1,0}[rgb]{0.5,0,0}[rgb]{0.25,1,0.5}还可以使用
--latex
标志向 HTML-CSS 样式器添加用户定义的仅 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}
示例
下面我们给出一个完整的逐步示例,添加一些高级功能并指出一些常见的陷阱。
首先,我们像往常一样创建 DataFrame 和 Styler,包括多级索引的行和列,这允许更多的格式化选项:
>>> 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一起工作:
然而,我们最终想添加一个仅适用于 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}