Daten mit TikZ einlesen und bearbeiten

Tabellen und Grafiken erstellen und anordnen


Neuling :)
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: Mi 15. Aug 2018, 13:02

Daten mit TikZ einlesen und bearbeiten

Beitrag von Neuling :) »

Hallo,

ich bin neu hier, falls ich also Fehler mache, bitte verzeiht und sagt es mir.

Ich bin auch in Latex noch nicht so erfahren und versuche mir alles so gut es geht zusammen zu bauen. Für mein aktuelles Problem hab ich aber noch keine Lösung gefunden und wäre für jede Idee sehr dankbar.

Jetzt zum Problem:
Ich habe eine Liste mit x-, y- und z-Koordinaten. Diese würde ich gern irgendwie einlesen und jedem Punkt (xi, yi, zi) eine Coordinate zuordnen, um dann später daraus was zu zeichnen.

Bis jetzt habe ich immer zu Fuß die Koordinaten übertragen, also mit
\coordinate (a) at (x1,y1,z1);
\coordinate (a) at (x2,y2,z2);

Zum Beispiel:
\documentclass[%
  a4paper,%
  11pt,%
]{scrartcl}
\usepackage[utf8x]{inputenc}

\usepackage[english, ngerman]{babel}

%%% Zeichenpakete
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{graphicx}

\begin{document}
\begin{tikzpicture}
	\coordinate (a) at (0,0,0);
	\coordinate (b) at (0,10,0);
	\coordinate (c) at (10,10,0);
	\coordinate (d) at (10,0,0);
	\coordinate (e) at (0,0,-10);
	\coordinate (f) at (0,10,-10);
	\coordinate (g) at (10,10,-10);
	\coordinate (h) at (10,0,-10);
	\coordinate (i) at (5,15,-5);
	
	\draw (a) -- (b);
	\draw (b) -- (c);
	\draw (c) -- (d);
	\draw (d) -- (a);
	\draw (e) -- (f);
	\draw (f) -- (g);
	\draw (g) -- (h);
	\draw (h) -- (e);
	\draw (a) -- (e);
	\draw (b) -- (f);
	\draw (c) -- (g);
	\draw (d) -- (h);
	\draw (b) -- (i);
	\draw (c) -- (i);
	\draw (f) -- (i);
	\draw (g) -- (i);
	

\end{tikzpicture}


\end{document}
Jetzt habe ich aber langsam so viele Daten, dass das etwas anstrengend ist.

Ich habe schon gelesen, dass man Plots erstellen kann, etwa:
\documentclass[%
  a4paper,%
  11pt,%
]{scrartcl}
\usepackage[utf8x]{inputenc}

\usepackage[english, ngerman]{babel}

%%% Zeichenpakete
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{graphicx}

\usepackage{filecontents}
\begin{filecontents*}{data.txt}
	0 	0 	0
	0 	10 	0
	10 	10 	0
	10 	0 	0
	0 	0 	-10
	0 	10 	-10
	10 	10 	-10
	10 	0 	-10
	5 	15 	-5
\end{filecontents*}

\begin{document}

\begin{tikzpicture}

\begin{axis}
\addplot [ycomb] table{data.txt};
\end{axis}
\end{tikzpicture}
\end{document}

Aber erstens will ich gerade die Achsen nicht haben, und zweitens werden da die Verbindungen der Punkte automatisch generiert und das brauche ich ja auch nicht. Ich will ja eigentlich die Punkte ansprechen und selbst sagen, mit welchem sie verbunden sein sollen.

Was Anderes habe ich bis jetzt noch nicht gefunden.
Ich hoffe, ich konnte mein Problem einigemaßen deutlich machen (und das mit dem Minimalbeispiel richtig umsetzen)
Kann mir hier eventuell jemand helfen? Ich wäre für jeden Tipp dankbar!

Liebe Grüße
und schonmal vielen Dank
Der Neuling

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Du könntest das Paket pgfplotstable nutzen. Im folgenden Beispiel werden die Koordinaten mit c0 bis c8 bezeichnet.
\documentclass{scrartcl} 

\usepackage{pgfplotstable}% lädt pgfplots, tikz, graphicx, ...
\pgfplotsset{compat=newest}% aktuell ist Version 1.16

\usepackage{filecontents} 
\begin{filecontents*}{data.txt} 
    0    0    0 
    0   10    0 
   10   10    0 
   10    0    0 
    0    0  -10 
    0   10  -10 
   10   10  -10 
   10    0  -10 
    5   15   -5 
\end{filecontents*}

\begin{document}
\begin{tikzpicture}

\pgfplotstableread{data.txt}{\data}
\pgfplotstablegetrowsof{\data}% Anzahl der Zeilen
\newcommand*\lastrow{}
\pgfmathtruncatemacro\lastrow{\pgfplotsretval-1}% letzte Zeilennummer

\foreach \r in {0,...,\lastrow}{
  \pgfplotstablegetelem{\r}{0}\of\data
  \edef\cx{\pgfplotsretval}
  \pgfplotstablegetelem{\r}{1}\of\data
  \edef\cy{\pgfplotsretval}
  \pgfplotstablegetelem{\r}{2}\of\data
  \edef\cz{\pgfplotsretval}
  \coordinate(c\r)at(\cx,\cy,\cz);
}

\draw
  (c0) foreach \i in {1,2,3}{--(c\i)}--cycle
  (c4) foreach \i in {5,6,7}{--(c\i)}--cycle
  foreach[evaluate={\j=\i+4}] \i in {0,...,3}{(c\i)--(c\j)}
  (c8) foreach \i in {1,2,5,6}{edge(c\i)}
;

\end{tikzpicture}
\end{document}

Neuling :)
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: Mi 15. Aug 2018, 13:02

Beitrag von Neuling :) »

Guten Abend,

vielen Dank für die Antwort!!
Genau so was hab ich gesucht. :D

Jetzt guck ich mal, dass ich das auf meine eigentlichen Daten anwenden kann.

Das hat mir wirklich sehr geholfen!

Danke und
Viele Grüße

Antworten