
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: \pgfplotstableforeachcolumn
Es 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 pgfplots
die 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}
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 csvsimple
Paket erleichtert das Lesen von .csv-Dateien und mit dem \csvloop
Befehl 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 \csvloop
und erzeugt eine Liste mit allen Koordinaten.
Innerhalb der axis
-Umgebung \foreach
kann 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}