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

Styler.to_latex(buf=None, *, column_format=None, позиция=None, position_float=None, hrules=None, clines=None, метка=None, заголовок=None, sparse_index=None, sparse_columns=None, multirow_align=None, multicol_align=None, siunitx=False, окружение=None, кодировка=None, convert_css=False)[источник]#

Запись Styler в файл, буфер или строку в формате LaTeX.

Добавлено в версии 1.3.0.

Параметры:
bufstr, объект пути, файлоподобный объект или None, по умолчанию None

Строка, объект пути (реализующий os.PathLike[str]), или файлоподобный объект, реализующий строку write() функция. Если None, результат возвращается в виде строки.

column_formatstr, optional

Спецификация столбца LaTeX, размещенная в местоположении:

\begin{tabular}{}

По умолчанию 'l' для индекса и нечисловых столбцов данных, и, для числовых столбцов данных, по умолчанию 'r', или 'S', если siunitx является True.

позицияstr, optional

Позиционный аргумент LaTeX (например, 'h!') для таблиц, размещенный в местоположении:

\\begin{table}[].

position_float{“centering”, “raggedleft”, “raggedright”}, опционально

Команда LaTeX float, размещенная в местоположении:

\begin{table}[]

\

Нельзя использовать, если environment является 'longtable'.

hrulesbool

Установить в True для добавления \toprule, \midrule и \bottomrule из пакета LaTeX {booktabs}. По умолчанию pandas.options.styler.latex.hrules, что является False.

Изменено в версии 1.4.0.

clinesstr, optional

Используйте для управления добавлением команд \cline для разделения меток индекса. Возможные значения:

  • None: команды cline не добавляются (по умолчанию).

  • "all;data": линия добавляется для каждого значения индекса, расширяя ширину таблицы, включая записи данных.

  • “all;index”: как выше, с линиями, простирающимися только на ширину записей индекса.

  • “skip-last;data”: для каждого значения индекса, кроме последнего уровня (который никогда не разреживается), добавляется клин, расширяющий ширину таблицы.

  • “skip-last;index”: как выше, с линиями, простирающимися только на ширину записей индекса.

Добавлено в версии 1.4.0.

меткаstr, optional

Метка LaTeX, включенная как: \label{

заголовокstr, tuple, опционально

Если строка, заголовок таблицы LaTeX включается как: \caption{}. Если кортеж, т.е. («полный заголовок», «краткий заголовок»), заголовок включается как: \caption[]{}.

sparse_indexbool, необязательно

Спарсифицировать ли отображение иерархического индекса. Установка значения False будет отображать каждый явный элемент уровня в иерархическом ключе для каждой строки. По умолчанию pandas.options.styler.sparse.index, что является True.

sparse_columnsbool, необязательно

Следует ли разрежать отображение иерархического индекса. Установка значения False будет отображать каждый явный элемент уровня в иерархическом ключе для каждого столбца. По умолчанию pandas.options.styler.sparse.columns, который True.

multirow_align{“c”, “t”, “b”, “naive”}, опционально

При разрежении иерархических MultiIndex, выравнивать ли текст по центру, сверху или снизу с использованием пакета 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". Если указана простая опция, отрисовывается без многоколоночности. Декораторы pipe также могут быть добавлены к не-простым значениям для рисования вертикальных линий, например, "|r" нарисует линию с левой стороны правовыровненных объединённых ячеек.

Изменено в версии 1.4.0.

siunitxbool, по умолчанию False

Установить в True для структурирования LaTeX, совместимого с пакетом {siunitx}.

окружениеstr, optional

Если задано, окружение, которое заменит 'table' в \\begin{table}. Если указан 'longtable', то отображается более подходящий шаблон. Если не указано, по умолчанию используется pandas.options.styler.latex.environment, что является None.

Добавлено в версии 1.4.0.

кодировкаstr, optional

Настройка кодировки символов. По умолчанию 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}
\robustify\bfseries
\sisetup{detect-all = true} (внутри {document})

курсив (с siunitx)

\usepackage{etoolbox}
\robustify\itshape
\sisetup{detect-all = true} (внутри {document})

окружение

\usepackage{longtable}, если arg — "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 со структурой по умолчанию: \ . Если есть несколько команд, последняя вкладывается рекурсивно, так что вышеуказанная выделенная ячейка отображается как \cellcolor{red} \bfseries 4.

Иногда этот формат не подходит для применяемой команды или комбинации пакетов LaTeX, которые используются, поэтому можно добавить дополнительные флаги к , внутри кортежа, что приводит к разным позициям требуемых скобок ( по умолчанию будучи таким же, как --nowrap):

Формат кортежа

Структура вывода

(<команда>,<опции>)

\<команда><опции> <отображаемое_значение>

(<команда>,<опции> --nowrap)

\<команда><опции> <отображаемое_значение>

(<команда>,<опции> --rwrap)

\{}

(<команда>,<опции> --wrap)

{\<команда><опции> <отображаемое_значение>}

(<команда>,<опции> --lwrap)

{\}

(<команда>,<опции> --dwrap)

{\}{}

Например, textbf команда для font-weight всегда должна использоваться с –rwrap так ('textbf', '--rwrap') отобразит работающую ячейку, обёрнутую фигурными скобками, как \textbf{}.

Более полный пример выглядит следующим образом:

>>> 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_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 to True, также возможно установить каждое индивидуальное правило, вручную задав table_styles, например, ниже мы устанавливаем регулярный toprule, установите hline для bottomrule и исключить midrule:

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

Если other 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.format() следует использовать перед вызовом Styler.to_latex, а также другие методы, такие как 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

Этот метод может преобразовать конструкцию Styler, созданную с HTML-CSS, в LaTeX, используя следующие ограниченные преобразования.

CSS-атрибут

Значение CSS

Команда LaTeX

Опции LaTeX

font-weight

жирный
жирный
bfseries
bfseries

font-style

курсив
косой
itshape
slshape

background-color

красный
#fe01ea
#f0e
rgb(128,255,0)
rgba(128,0,0,0.5)
rgb(25%,255,50%)

цвет ячейки

{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
#f0e
rgb(128,255,0)
rgba(128,0,0,0.5)
rgb(25%,255,50%)

цвет

{красный}
[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 флаг и добавление опций парсинга LaTeX, которые конвертер будет обнаруживать внутри CSS-комментария.

>>> 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 как обычно, включая строки и столбцы 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