Seite 1 von 2

Tikz Graphik verschönern

Verfasst: Di 14. Jun 2016, 15:19
von Trauminsel
Guten Nachmittag

Die nachfolgende Graphik erfüllt ihren Zweck in der Arbeit. Allerdings wäre es noch schöner wenn ich keine Punkte verwenden müsste um anzuzeigen, wohin die Buchstaben und Linien gehören. Wenn also anstelle von den Punkten direkt die Buchstaben allenfalls in einem Kästchen stünden.

Geht das ohne viel Aufwand?
\documentclass[a4paper,12pt]{article} 

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern} 
\usepackage[ngerman]{babel}


\usepackage[margin=10pt,font=small,labelfont=bf,
labelsep=endash]{caption} 

\usepackage{graphicx} 
\usepackage{tikz} 
\usetikzlibrary{graphs} %Notwendig für spezielle Graphiken mit tikz 

\begin{document} 


\begin{figure}[h] 
\centering 
\begin{tikzpicture} 
\node[label=above:$Z1$] (Z1) at (0,0) {}; 
\node[label=left:$Z2$] (Z2) at (-2,2) {}; 
\node[label=right:$Z3$] (Z3) at (2,2) {}; 
\node[label=above:$Z4$] (Z4) at (2,-2) {}; 
\node[label=above:$Z5$] (Z5) at (-2,-2) {}; 
\node[label=right:$Z6$] (Z6) at (8,0) {}; 
\draw (Z1) -- (Z2); 
\draw (Z1) -- (Z3); 
\draw (Z1) -- (Z4); 
\draw (Z1) -- (Z5); 
\draw (Z1) -- (Z6); 
\draw (Z2) -- (Z3); 
\fill(Z1) circle (2pt); 
\fill(Z2) circle (2pt); 
\fill(Z3) circle (2pt); 
\fill(Z4) circle (2pt); 
\fill(Z5) circle (2pt); 
\fill(Z6) circle (2pt); 
\end{tikzpicture} 
\captionof{figure}{Verhältnis der Zustände} 
\label{GraphikVerhaltnis} 
\end{figure} 

\end{document} 


Kurzer Prozess

Verfasst: Di 14. Jun 2016, 16:16
von Beobachter
Du setzt explizit leere Knoten mit einer Marke (label) und zeichnest dann an deren Stelle die kleinen schwarzen Punkte. Das gewünschte Ergebnis ist in einem einzigen Schritt erreichbar. Wenn die Buchstaben doch nicht eingerahmt werden sollen, dann lasse die Option für tikzpicture einfach weg.
\documentclass[12pt,a4paper,ngerman]{article} 
\usepackage[T1]{fontenc}
\usepackage{selinput}  % Ersatz für `inputenc`
\SelectInputMappings{
  adieresis={ä},
  germandbls={ß}
}
\usepackage{lmodern} 
\usepackage{babel}
\usepackage{microtype}
\usepackage[margin=10pt,font=small,labelfont=bf,labelsep=endash]{caption} 
\usepackage{tikz} 

\begin{document} 
  \begin{figure}[!htb] 
    \centering 
    \begin{tikzpicture}[every node/.style=draw]
      \node (Z1) at (0,0) {$Z_1$}; 
      \node (Z2) at (-2,2) {$Z_2$}; 
      \node (Z3) at (2,2) {$Z_3$}; 
      \node (Z4) at (2,-2) {$Z_4$}; 
      \node (Z5) at (-2,-2) {$Z_5$}; 
      \node (Z6) at (8,0) {$Z_6$}; 
      \draw (Z1) -- (Z2); 
      \draw (Z1) -- (Z3); 
      \draw (Z1) -- (Z4); 
      \draw (Z1) -- (Z5); 
      \draw (Z1) -- (Z6); 
      \draw (Z2) -- (Z3); 
    \end{tikzpicture} 
    \caption{Verhältnis der Zustände} 
    \label{fig:verhaeltnis} 
  \end{figure} 
\end{document}

Verfasst: Di 14. Jun 2016, 22:12
von Bartman
Mein Beispiel orientiert sich am Quelltext von Beobachter und zeigt eine weitere Möglichkeit, Deine Abbildung zu zeichen.
\documentclass[margin=5pt]{standalone}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{tikz}

\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}[
	nodes={
		draw=black!50,
		outer sep=-.45pt,
		rounded corners,
		thick,
		top color=white,
		bottom color=black!20
	}%,
%	node distance=15mm and 15mm
]
   \node (Z1)                                   {$Z_1$};
   \node (Z2) [above left  = of Z1]             {$Z_2$};
   \node (Z3) [above right = of Z1]             {$Z_3$};
   \node (Z4) [below right = of Z1]             {$Z_4$};
   \node (Z5) [below left  = of Z1]             {$Z_5$};
   \node (Z6) [right       = of Z1, xshift=5cm] {$Z_6$};

   \foreach \i in {2,...,6}{
      \draw (Z1) -- (Z\i); 
   }
   \draw (Z2) -- (Z3); 
\end{tikzpicture}
\end{document}

Verfasst: Mi 15. Jun 2016, 08:24
von Trauminsel
Danke euch beiden :) wieder etwas gelernt :)

@Bartman: Was macht deine Variante besser als die von Beobachter? Seine ist doch deutlich einfacher.

Verfasst: Mi 15. Jun 2016, 09:31
von DADABBI
Zum einen musst du nicht mehr für alles Koordinaten angeben, sondern sagst nur noch, wo die Knoten relativ zu den vorhandenen hin sollen. Das verringert die Wahrscheinlichkeit eines Koordinatenfehlers und ist besonder bei größeren Grafiken von Vorteil.

Zum anderen werden die Verbindungslinien einfach in einer Schleife gezeichnet. Die Wahrscheinlichkeit, eine Verbindungslinie zu vergessen, ist so geringer.

Was besser ist, musst du letztlich selbst entscheiden. Beides hat Vor- und Nachteile. Ich selbst finde Batmans Lösung aber eleganter.

Verfasst: Mi 15. Jun 2016, 09:42
von Trauminsel
ja jetzt sehe ich es auch. Ja bei grossen Projekten ist das deutlich einfacher und erspart ein stückweit das herumprobieren.

EDIT:
Ich glaube ich habe mit ein wenig herumprobieren verstanden wie der Code von Bartman funktioniert.

Nur der Teil ist mir noch nicht ganz klar:

\foreach \i in {1,...,6}{
\draw (Z1) -- (Z\i);

Wodurch wird genau \i bestimmt. Durch meine Beschriftung von Z1-Z1 nach \node ?

Das bedeutet, dass ich mit dieser Methode immer alle Punkte durchnummerieren muss, damit tikz versteht auf was ich mich beziehe richtig?

EDIT2:

Welchen Befehl nutze ich wenn ich etwa zwischen z1 und z3 setzten möchte und zwar exakt auf der Linie zwischen z1 und z3?

Die Tikz-Dokumentation die ich habe ist leider sehr lange, gibt es eine Seite wo all diese Befehle übersichtlich aufgelistet sind?

Verfasst: Mi 15. Jun 2016, 10:40
von esdd
Das geht mit
\path (Z1) -- node[pos=.5]{x}(Z3);
Woei in dem Fall [pos=.5] auch weg gelassen werden kann, weil es bei der Angabe von node nach -- default ist.


Gibt man den Node dagegen am Pfadende an, wäre pos=1 default.
\path (Z1) -- (Z3) node[pos=.5]{x};
Man könnte auch die calc Bibliothek laden und dann
\path ($(Z1)!0.5!(Z3)$)node{x};
oder
\node at ($(Z1)!0.5!(Z3)$){x};
nutzen.

Bei TikZ gibt es so viele Befehle und noch mehr Möglichkeiten, dass deren kurze, übersichtliche Darstellung eigentlich unmöglich ist. Für den Beginn dürften die Tutorials am Anfang der Doku ganz hilfreich sein sowie ein Querlesen des Teils "TikZ ist kein Zeichenprogramm", damit man ein Gefühl für die Möglichkeiten bekommt und eine Idee, wo man suchen kann. Der Rest kommt dann mit dem Anschauen von Beispielen und vorallem dem Anwenden.

Verfasst: Mi 22. Jun 2016, 11:53
von Trauminsel
Ich habe die Lösung von Beobachter verwendet, da ich mit diesem Ansatz vertrauter war.

Momentan sieht das ganze so aus:
\documentclass[a4paper,12pt]{article} 

\usepackage[utf8]{inputenc} 
\usepackage[T1]{fontenc} 
\usepackage{lmodern} 
\usepackage[ngerman]{babel} 


\usepackage{graphicx} 
\usepackage{tikz} 
\usetikzlibrary{graphs} %Notwendig für spezielle Graphiken mit tikz 

\begin{document} 

    \begin{tikzpicture}[every node/.style=draw]
    %Raster Zeichnen
      \draw [color=gray!30]  [step=2.5mm] (-1,-1.25) grid (9.25,2.25); %Damit kann ich ein Häuschenpapier machen
      \node (Z1) at (0,0) {Z1}; 
      \node (Z2) at  (2,1.5) {Z2}; 
      \node (Z3) at (3.5 ,1.5) {Z3}; 
      \node (Z4) at (1.0,-0.5) {Z4}; 
       \node (Z5) at (2.75, 0.75) {Z5}; 
      \node (Z6) at (8.0,0.0){Z6}; 
      \draw (Z1) -- (Z2); 
      \draw (Z1) -- (Z4); 
      \draw (Z1) -- (Z5); 
      \draw[dotted,  line width=1.0pt] (Z1) -- (Z6); 
      \draw (Z2) -- (Z3); 
       \draw[dashed,  line width=1.0pt] (Z3) -- (Z6);
    \end{tikzpicture} 
  
\end{document}
 
Jetzt würde ich gerne noch eine Linie zwischen Z4 un Z6 zeichnen, diese aber mit einem Fragezeichen versehen. Das kann ich natürlich so machen, dass ich mit \node ....ein Fragezeichen richtig positioniere. Dann wäre es aber auch in einem Kasten und das will ich nicht.

Deshalb zwei Fragen:

1.) Wie ist der Befehl every node...zu modifizieren damit nur die \node Z1-Z6 in einem Kasten sind.

2.) Gibt es einen einfachen Weg, damit ich das Fragezeichen nicht manuel ausrichten muss sondern das es sich schön unterhalb der Mitte der Linie zwischen Z4 und Z6 befindet.

Vielen Dank für eure Hilfe.

Verfasst: Mi 22. Jun 2016, 13:01
von Beinschuss
Vielleicht, indem Du Dir ein TikzSet für die Nodes mit Rahmen definierst:

\documentclass[a4paper,12pt]{article} 
\usepackage[utf8]{inputenc} 
\usepackage[T1]{fontenc} 
\usepackage{lmodern} 
\usepackage[ngerman]{babel} 
\usepackage{graphicx} 
\usepackage{tikz} 
\usetikzlibrary{graphs} %Notwendig für spezielle Graphiken mit tikz 
\tikzset{node1/.style={rectangle,rounded corners,draw=black, text centered},}
\begin{document} 
    \begin{tikzpicture}
    %Raster Zeichnen
      \draw [color=gray!30]  [step=2.5mm] (-1,-1.25) grid (9.25,2.25); %Damit kann ich ein Häuschenpapier machen
      \node[node1] (Z1) at (0,0) {Z1}; 
      \node[node1] (Z2) at  (2,1.5) {Z2}; 
      \node[node1] (Z3) at (3.5 ,1.5) {Z3}; 
      \node[node1] (Z4) at (1.0,-0.5) {Z4}; 
      \node[node1] (Z5) at (2.75, 0.75) {Z5}; 
      \node[node1] (Z6) at (8.0,0.0){Z6}; 
      \draw (Z1) -- (Z2); 
      \draw (Z1) -- (Z4); 
      \draw (Z1) -- (Z5); 
      \draw[dotted,  line width=1.0pt] (Z1) -- (Z6); 
      \draw (Z2) -- (Z3); 
       \draw[dashed,  line width=1.0pt] (Z3) -- (Z6);
       
       	\draw(Z4) -- node[below]{?} (Z6.west);
    \end{tikzpicture} 
  
\end{document}

Verfasst: Mi 22. Jun 2016, 13:39
von Trauminsel
ich habe alles verstanden was du gemacht hast beinschuss

Ausser wieso du z6 in zi6 umgewandelt hast.

gibt es dazu einen Grund?