pgfplots(Tabelle) Tabellenkalkulationsähnliche Formeln

pgfplots(Tabelle) Tabellenkalkulationsähnliche Formeln

Ich experimentiere derzeit mit den Paketen pgfplots und pgfplotstable. Die Möglichkeit, neue Spalten zu erstellen (durch Kopieren oder Transformieren einer anderen Spalte), ist mir aufgefallen, als ich mich fragte, ob es möglich ist, Formeln wie in Tabellenkalkulationen zu verwenden (d. h. der Wert jeder Zelle der neuen Spalte sollte der Wert der Zelle links davon (dieselbe Zeile) + der Wert der Zelle darüber (dieselbe Spalte) sein, und ja, es muss eine Initialisierung erfolgen).

Kennt jemand eine solche Funktion? Und wenn ja, wie geht das? (unabhängig davon, ob es nur pgfplotstable oder sogar pgfplots ist)

Antwort1

pgfplotstableDies kann mit einigen Einschränkungen mithilfe des Makros von erfolgen \pgfplotstablecreatecol(auch mit , create on useum die Spalte data verzögert zu erstellen, aber ihr Inhalt würde dann nach der Rückkehr von verloren gehen \pgfplotstabletypeset). Laut der pgfplotstableDokumentation:

Derzeit können Sie nur auf drei Werte einer Spalte gleichzeitig zugreifen: die aktuelle Zeile, die vorherige Zeile und die nächste Zeile. Der Zugriff auf beliebige Indizes wird (noch) nicht unterstützt.

Im folgenden Beispiel habe ich die in der Frage beschriebene Formel implementiert und sie mit dem (beliebigen) Wert 100 in „Zeile -1“ initialisiert. Da die anfänglichen Tabellendaten wie folgt lauten:

 x   y
 0   1
 5   6
10  11

Die berechneten Werte sind:

  • 1 + 100 = 101

  • 6 + 101 = 107

  • 11 + 107 = 118

Um auf zuvor berechnete Werte in der dynamisch erstellten Spalte zugreifen zu können, speichere ich diese global (hier: nur den zuletzt berechneten Wert, mit \xdef\myPreviousValue{...}), da pgfplotstabledas \prevrowMakro von anscheinend keinen Zugriff auf Werte aus der erstellten Spalte gewährt. Wenn der Zugriff aufbeliebigWenn in der zu erstellenden Spalte ein zuvor berechneter Wert gewünscht wird, könnte man beispielsweise ein pgfmathArray 1 oder eine expl3 tlODER- Variable verwenden.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}

Bildbeschreibung hier eingeben

Hinweis: Das int()in dem pgfmathvon mir verwendeten Ausdruck könnte unnötig erscheinen, da standardmäßig \pgfplotstabletypesetWerte mit formatiert werden \pgfmathprintnumberund, ebenfalls standardmäßig, \pgfmathprintnumbererkennt, ob die Eingabe einen Bruchteil gleich Null hat, um das Drucken von Ganzzahlen als Sonderfall zu definieren. Beispielsweise \pgfmathprintnumber{118.0}druckt standardmäßig 118. Ohne das würden int()die in gespeicherten Werte \myValue– und damit auch in der erstellten Speicherspalte und in \myPreviousValue– jedoch ein abschließendes haben .0; die Verwendung der int()Funktion verhindert dies.


Fußnote

  1. Suche dasTikZ & PGF Handbuchfür „Array-Zugriffsoperatoren“ in derMathematische und objektorientierte EnginesTeil.

verwandte Informationen