pgfplots(table) формулы, похожие на электронные таблицы

pgfplots(table) формулы, похожие на электронные таблицы

В настоящее время я экспериментирую с пакетами pgfplots и pgfplotstable. Я заметил возможность создания новых столбцов (копирование или преобразование другого столбца), когда мне было интересно, можно ли использовать формулы, подобные формулам в электронных таблицах (то есть значение каждой ячейки нового столбца должно быть равно значению ячейки слева от нее (та же строка) + значение ячейки выше (тот же столбец), и да, должна быть какая-то инициализация).

Кто-нибудь знает о такой функции? И если да, то как это сделать? (неважно, только pgfplotstable или даже pgfplots)

решение1

Это можно сделать с некоторыми ограничениями, используя pgfplotstableмакрос \pgfplotstablecreatecol(также с create on useленивым созданием данных столбца, но его содержимое будет потеряно после возврата из \pgfplotstabletypeset). Согласно pgfplotstableдокументации:

В настоящее время вы можете получить доступ только к трем значениям одного столбца одновременно: текущая строка, предыдущая строка и следующая строка. Доступ к произвольным индексам (пока) не поддерживается.

В примере ниже я реализовал формулу, описанную в вопросе, инициализировав ее (произвольным) значением 100 в «строке -1». Поскольку исходные данные таблицы таковы:

 x   y
 0   1
 5   6
10  11

вычисленные значения:

  • 1 + 100 = 101

  • 6 + 101 = 107

  • 11 + 107 = 118

Чтобы получить доступ к ранее вычисленным значениям в динамически создаваемом столбце, я сохраняю их глобально (здесь: только самое последнее вычисленное значение, используя \xdef\myPreviousValue{...}) pgfplotstable, поскольку\prevrow не предоставляет доступа к значениям из создаваемого столбца, как кажется. Если доступ клюбойЕсли требуется ранее вычисленное значение в создаваемом столбце, можно использовать, например, pgfmathмассив 1 или переменную expl3 tlor .seq

\begin{filecontents*}{data.csv}
 x   y
 0   1
 5   6
10  11
\end{filecontents*}

\documentclass{article}
\usepackage{booktabs}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.16}

\pgfplotstableread[row sep=newline, col sep=space]{data.csv}\myTable

\newcommand*{\myPreviousValue}{100} % initialization (row -1, sort of)

% Dynamically create column z
\pgfplotstablecreatecol[
  create col/assign/.code={%
    \pgfmathsetmacro{\myValue}{int(\thisrow{y} + \myPreviousValue)}%
    \pgfplotstableset{create col/next content/.expand once={\myValue}}%
    \xdef\myPreviousValue{\myValue}%
  }]
{z}\myTable

\begin{document}

\pgfplotstabletypeset[
  columns/x/.style={column name={$x$}},
  columns/y/.style={column name={$y$}},
  columns/z/.style={column name={$z$}},
  every head row/.style={before row=\toprule, after row=\midrule},
  every last row/.style={after row=\bottomrule}
  ]{\myTable}

\end{document}

введите описание изображения здесь

Примечание: int()в pgfmathвыражении, которое я использовал, может показаться ненужным, поскольку по умолчанию \pgfplotstabletypesetформатирует значения с помощью \pgfmathprintnumberи, опять же по умолчанию, \pgfmathprintnumberопределяет, есть ли у входных данных дробная часть, равная нулю, чтобы выделить случай печати целых чисел. Например, \pgfmathprintnumber{118.0}по умолчанию печатает 118. Однако без int()значения, хранящиеся в \myValue—а значит, и в созданном столбце в памяти и в \myPreviousValue— имели бы завершающий .0; использование int()функции предотвращает это.


Сноска

  1. ПоискТикРуководство по Z и PGFдля «операторов доступа к массиву» вМатематические и объектно-ориентированные движкичасть.

Связанный контент