%20%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B%2C%20%D0%BF%D0%BE%D1%85%D0%BE%D0%B6%D0%B8%D0%B5%20%D0%BD%D0%B0%20%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B.png)
В настоящее время я экспериментирую с пакетами 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
tl
or .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()
функции предотвращает это.
Сноска
- ПоискТикРуководство по Z и PGFдля «операторов доступа к массиву» вМатематические и объектно-ориентированные движкичасть.