Schleife über pgfplotstable-Zeilen

Schleife über pgfplotstable-Zeilen

Ich möchte ein Tikz-Bild auf Grundlage von Daten zeichnen, die aus einer PGF-Tabelle geladen wurden. Kann ich es irgendwie wie ein Standardbild verwenden \foreach?

\foreach \i/\j in {\mytable}
  \draw...

Ich habe Folgendes festgestellt: \pgfplotstableforeachcolumnEs iteriert in der falschen Dimension und macht die Spalten zu einer.

Ich habe darüber nachgedacht, die Tabelle zu setzen \pgfplotstabletypeset, aber es sieht so aus, als gäbe es keine Möglichkeit, die tabellarische Umgebung daraus zu entfernen.

Gibt es fertige Möglichkeiten, über die pgfplotstable zu iterieren? Gibt es eine Möglichkeit, sie in das von Tikz foreach benötigte Format zu setzen?

\documentclass{article}

\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}

\begin{document}
\pgfplotstableread{
1 2
2 3
}\loadedtable

% Should behave like this:
\begin{tikzpicture}
\foreach \i/\j \in {1/2,2/3}
\draw (0,0) -- (\i,\j);
\end{tikpicture}

% and look like this
\begin{tikzpicture}
\magic_pgf_tables_foreach \i/\j \in \loadedtable
\draw (0,0) -- (\i,\j);
\end{tikpicture}

% or this
\begin{tikzpicture}
\foreach \i/\j \in {\magic_pgftable2\loadedtable}
\draw (0,0) -- (\i,\j);
\end{tikpicture}
\end{document}

Antwort1

Einzelne Elemente können Sie mit abziehen \pgfplotstablegetelem.

\documentclass{standalone}

\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}

\begin{document}
\pgfplotstableread{
x y
1 2
2 3
}\loadedtable

% and look like this
\begin{tikzpicture}
\foreach \row in {0,1} {
  \pgfplotstablegetelem{\row}{x}\of\loadedtable
  \let\x=\pgfplotsretval
  \pgfplotstablegetelem{\row}{y}\of\loadedtable
  \let\y=\pgfplotsretval
  \draw (0,0) -- (\x,\y);
}
\end{tikzpicture}
\end{document}

Antwort2

Nach einigem Herumprobieren bin ich auf eine Lösung gekommen, die aber noch viel Raum für Verbesserungen lässt. So weiß ich beispielsweise nicht, wie ich pgfplotsdie Linienfärbung mit dem anweisen soll cycle list, außerdem müssen die Achsengrenzen derzeit manuell festgelegt werden. Hier wäre eine automatische Ermittlung sinnvoller.

Trotzdem möchte ich euch meine Idee nicht vorenthalten, vielleicht reicht diese für eure Ansprüche ja schon aus.

\documentclass{article}

\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{csvsimple}

\pgfplotsset{compat = 1.17}

\begin{document}

\begin{filecontents*}{data.csv}
    x,y
    1,2
    2,3
    3,4
    4,5
\end{filecontents*}

\begin{tikzpicture}
    \begin{axis}[%
        xmin = 0,
        xmax = 4,
        ymin = 0,
        ymax = 5,
        enlargelimits%
    ]
        \pgfplotsextra{
            \csvreader{data.csv}%
            {x = \x, y = \y}%
            {%
                \pgfpathmoveto{\pgfplotspointaxisxy{0}{0}}
                \pgfpathlineto{\pgfplotspointaxisxy{\x}{\y}}
                \pgfusepath{stroke}
            }
        }
    \end{axis}
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

Bearbeiten

Ich habe mich nun noch etwas länger mit diesem spannenden Problem beschäftigt und konnte schließlich alle oben genannten Probleme beheben.

Das csvsimplePaket erleichtert das Lesen von .csv-Dateien und mit dem \csvloopBefehl ist es problemlos möglich, für jede Zeile der Datei einen Befehl auszuführen. Ich habe also einen Befehl erstellt, der bei jedem Aufruf seinen Inhalt an eine Liste anhängt. Dieser Befehl wird in verwendet \csvloopund erzeugt eine Liste mit allen Koordinaten.

Innerhalb der axis-Umgebung \foreachkann nun ein Befehl verwendet werden, um die Koordinaten aus der Liste auszulesen und für jede Koordinate einen Plot von (0,0)bis hinzuzufügen.(x,y)

\documentclass{article}

% Packages
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{csvsimple}
\usepackage{etoolbox}

% Package settings
\pgfplotsset{compat = 1.17}

% Define custom macros to parse the table content into a list
\newcommand{\coordinates}{}
\newcommand{\coordinate}[1]{%
    \ifdefempty{\coordinates}
        {\xappto\coordinates{#1}}
        {\xappto\coordinates{,#1}}
}

% Load demo .csv file
\begin{filecontents*}{mydata.csv}
    x,y
    1,2
    2,3
    3,4
    4,5
\end{filecontents*}


\begin{document}
    
    % Read the table and parse it to a list
    \csvloop{%
        file = {mydata.csv},%
        column names = {x=\x, y=\y},%
        command = \coordinate{\x/\y}%
    }
    
    \begin{tikzpicture}
        \begin{axis}[%
            enlargelimits%
        ]
            \foreach \x/\y in \coordinates {
                \addplot+[mark = none] coordinates {
                    (0,0) (\x,\y)
                };
            }
        \end{axis}
    \end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen