pgfplots (tabla) hoja de cálculo como fórmulas

pgfplots (tabla) hoja de cálculo como fórmulas

Actualmente estoy experimentando con los paquetes pgfplots y pgfplotstable. Noté la posibilidad de crear nuevas columnas (copiando o transformando otra columna) cuando me preguntaba si era posible usar fórmulas similares a las de una hoja de cálculo (lo que significa que el valor de cada celda de la nueva columna debe ser el valor de la celda a su izquierda ( misma fila) + el valor de la celda de arriba (misma columna), y sí, tiene que haber alguna inicialización).

¿Alguien sabe de tal característica? Y en caso afirmativo, ¿cómo hacer esto? (independientemente de si es solo pgfplotstable o incluso pgfplots)

Respuesta1

Esto se puede hacer con algunas limitaciones usando pgfplotstablela \pgfplotstablecreatecolmacro (también para create on usecrear lentamente los datos de la columna, pero su contenido se perdería después de regresar de \pgfplotstabletypeset). Según la pgfplotstabledocumentación:

Actualmente, sólo puedes acceder a tres valores de una columna a la vez: la fila actual, la fila anterior y la fila siguiente. (Aún) no se admite el acceso a índices arbitrarios.

En el siguiente ejemplo, implementé la fórmula descrita en la pregunta, inicializándola con el valor (arbitrario) 100 en la "fila -1". Dado que los datos de la tabla inicial son:

 x   y
 0   1
 5   6
10  11

los valores calculados son:

  • 1 + 100 = 101

  • 6 + 101 = 107

  • 11 + 107 = 118

Para acceder a los valores calculados previamente en la columna que se crea dinámicamente, los almaceno globalmente (aquí: solo el valor calculado más recientemente, usando \xdef\myPreviousValue{...}) pgfplotstableporque\prevrow macro no da acceso a los valores de la columna que se está creando, ya que parece. Si el acceso acualquierSi se desea un valor calculado previamente en la columna que se está creando, se podría usar una pgfmathmatriz 1 o una variable expl3 tlo seq, por ejemplo.

\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}

ingrese la descripción de la imagen aquí

Nota: int()en la pgfmathexpresión que utilicé puede parecer innecesaria porque, de forma predeterminada, \pgfplotstabletypesetformatea los valores usando \pgfmathprintnumbery, nuevamente de manera predeterminada, \pgfmathprintnumberdetecta si la entrada tiene una parte fraccionaria igual a cero para aplicar casos especiales a la impresión de números enteros. Por ejemplo, \pgfmathprintnumber{118.0}imprime 118 de forma predeterminada. Sin embargo, sin int(), los valores almacenados en \myValue(y por lo tanto también en la columna en memoria creada y en \myPreviousValue) tendrían un final .0; el uso de la int()función evita esto.


Nota

  1. buscar elTikManual de Z y PGFpara “operadores de acceso a matrices” en elMotores matemáticos y orientados a objetosparte.

información relacionada