Tikz Graphik verschönern

Tabellen und Grafiken erstellen und anordnen


Trauminsel
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 69
Registriert: Mi 13. Apr 2016, 10:21

Tikz Graphik verschönern

Beitrag 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} 


Beobachter

Kurzer Prozess

Beitrag 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}

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2466
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Beitrag 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}

Trauminsel
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 69
Registriert: Mi 13. Apr 2016, 10:21

Beitrag von Trauminsel »

Danke euch beiden :) wieder etwas gelernt :)

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

DADABBI

Beitrag 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.

Trauminsel
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 69
Registriert: Mi 13. Apr 2016, 10:21

Beitrag 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?

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

Beitrag 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.

Trauminsel
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 69
Registriert: Mi 13. Apr 2016, 10:21

Beitrag 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.

Beinschuss
Forum-Meister
Forum-Meister
Beiträge: 808
Registriert: Di 2. Okt 2012, 21:42
Wohnort: NRW

Beitrag 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}
Zuletzt geändert von Beinschuss am Mi 22. Jun 2016, 17:20, insgesamt 1-mal geändert.

Trauminsel
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 69
Registriert: Mi 13. Apr 2016, 10:21

Beitrag von Trauminsel »

ich habe alles verstanden was du gemacht hast beinschuss

Ausser wieso du z6 in zi6 umgewandelt hast.

gibt es dazu einen Grund?

Antworten