planilha pgfplots(tabela) como fórmulas

planilha pgfplots(tabela) como fórmulas

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 pgfplotstablede \pgfplotstablecreatecol(também para create on usecriar preguiçosamente os dados da coluna, mas seu conteúdo seria perdido após retornar de \pgfplotstabletypeset). De acordo com a pgfplotstabledocumentaçã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 pgfplotstablea \prevrowmacro 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 pgfmatharray 1 ou uma variável expl3 tlou 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}

insira a descrição da imagem aqui

Nota: o int()na pgfmathexpressão que usei pode parecer desnecessário porque por padrão, \pgfplotstabletypesetformata valores usando \pgfmathprintnumbere, novamente por padrão, \pgfmathprintnumberdetecta 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é

  1. Procure oTikManual Z & PGFpara “operadores de acesso a array” noMotores matemáticos e orientados a objetospapel.

informação relacionada