%20como%20f%C3%B3rmulas.png)
Atualmente estou experimentando os pacotes pgfplots e pgfplotstable. Percebi a possibilidade de criar novas colunas (copiando ou transformando outra coluna) quando me perguntei se era possível usar fórmulas do tipo planilha (ou seja, o valor de cada célula da nova coluna deve ser o valor da célula à sua esquerda ( mesma linha) + o valor da célula acima (mesma coluna), e sim, deve haver alguma inicialização).
Alguém conhece esse recurso? E se sim, como fazer isso? (independentemente de ser apenas pgfplotstable ou mesmo pgfplots)
Responder1
Isso pode ser feito com algumas limitações usando a macro pgfplotstable
de \pgfplotstablecreatecol
(também para create on use
criar preguiçosamente os dados da coluna, mas seu conteúdo seria perdido após retornar de \pgfplotstabletypeset
). De acordo com a pgfplotstable
documentação:
Atualmente, você só pode acessar três valores de uma coluna por vez: a linha atual, a linha anterior e a próxima linha. O acesso a índices arbitrários (ainda) não é suportado.
No exemplo abaixo, implementei a fórmula descrita na pergunta, inicializando-a com o valor (arbitrário) 100 na “linha -1”. Como os dados iniciais da tabela são:
x y
0 1
5 6
10 11
os valores calculados são:
1 + 100 = 101
6 + 101 = 107
11 + 107 = 118
Para acessar os valores computados anteriormente na coluna que está sendo criada dinamicamente, eu os armazeno globalmente (aqui: apenas o valor computado mais recentemente, usando \xdef\myPreviousValue{...}
) porque pgfplotstable
a \prevrow
macro de não dá acesso aos valores da coluna que está sendo criada, pois parece. Se o acesso aqualquerSe desejar um valor previamente calculado na coluna que está sendo criada, pode-se usar um pgfmath
array 1 ou uma variável expl3
tl
ou seq
, por exemplo.
\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}
Nota: o int()
na pgfmath
expressão que usei pode parecer desnecessário porque por padrão, \pgfplotstabletypeset
formata valores usando \pgfmathprintnumber
e, novamente por padrão, \pgfmathprintnumber
detecta se a entrada tem uma parte fracionária igual a zero para um caso especial na impressão de números inteiros. Por exemplo, \pgfmathprintnumber{118.0}
imprime 118 por padrão. No entanto, sem o int()
, os valores armazenados em \myValue
—e, portanto, também na coluna criada na memória e em \myPreviousValue
—teriam um final .0
; usar a int()
função evita isso.
Nota de rodapé
- Procure oTikManual Z & PGFpara “operadores de acesso a array” noMotores matemáticos e orientados a objetospapel.