2
1

Hallo, möchte ein Ishikawa (Fishbone)-Diagramm mittels Tikz erstellen jedoch hänge ich jetzt seit geraumer Zeit an einer Stelle an der ich nicht weiter komme.

So ungefähr sollte das Gerüst aussehen:

http://i.stack.imgur.com/LHONZ.gif

Folgendes wurde hierzu schon verfasst:

Open in Online-Editor
   \tikzset{
      ishikawa/.style = {align=center, inner sep=0pt, text centered,
        %font=\sffamily
        },
      matter/.style={       % Wirkung=Betrachtete Störgröße
      rectangle,minimum size=6mm,very thick,draw=red!70!black!40,top color=white,bottom color=red!50!black!20,font=\itshape
      },
      level_1/.style={              % Haupteinflussfaktoren
      ellipse,node distance=60pt,minimum size=6mm,very thick,draw=red!50!black!50,top color=white,bottom color=red!50!black!20,font=   \itshape
      },
      level_2/.style={              % Nebeneinflussfaktoren
      rectangle,minimum size=6mm,font=\itshape,font=\tiny
      }
    }
    \begin{tikzpicture}[->,>=stealth',level/.style={sibling distance = 5cm/#1,
      level distance = 1.5cm}
    ]
            \node (Grund)           [matter]        at ( 12,0)              {CPA};
            %       \path[draw,->] (0,0) -- (Grund)
                    \draw [->,very thick] ( 0,0) -- (Grund);
            \node (tl_1_1)          [level_1]       at ( 0,5)               {Material};
            \node (bl_1_1)          [level_1]       at ( 0,-5)              {Methode};
            %       child{ node [level_2] {msndfbdejfsdlfksf}}
            \node (tl_1_2)          [level_1, right=of tl_1_1]      {Maschine};
            %       child{ node [level_2] {msndfbdejfsdlfksf}}
            \node (bl_1_2)          [level_1, right=of bl_1_1]      {Mensch};
    %               child{ node [level_2] {msndfbdejfsdlfksf}}
            \node (tl_1_3)          [level_1, right=of tl_1_2]      {Messtechnik};
            %       child{ node [level_2] {msndfbdejfsdlfksf}}
            \node (bl_1_3)          [level_1, right=of bl_1_2]      {Mitwelt};
    %               child{ node [level_2] {msndfbdejfsdlfksf}}
    \end{tikzpicture}]

Dies produziert mir meine Haupteinflussfaktoren sowie das Problem mit dem Hauptpfad.

Nun Weiss ich jedoch nicht wie ich von den Haupteinflussfaktoren Pfade zum Hauptpfad erstellen kann. Selbiges gilt für die Unterpfade.

Um Antworten ware ich euch dankbar.

Gerold

gefragt 16 Jun '15, 16:21

gerold's gravatar image

gerold
20112
Akzeptiert-Rate: 0%

bearbeitet 07 Feb '16, 12:02

saputello's gravatar image

saputello
11.1k174365

Ursprünglich von LaTeX-community

(16 Jun '15, 16:34) Johannes

Crosspost auf TeX.SX

(16 Jun '15, 18:55) Henri
1

Wie allgemein muss das Diagramm denn gezeichnet werden? positioning ohne die on grid option würde ich hier nicht verwenden, da so nur die Abstände zwischen den Nodes gesetzt werden. Da die Nodes unterschiedlich breit sind, führt das zu einer versetzen Positionierung. Ich würde hier eine 3x4-Matrix verwenden, und die Linien separat zeichnen.

(16 Jun '15, 21:25) Qrrbrbirlbel

Hier ein Vorschlag mit einer matrix. Für die Schräge verwende ich eine Kombination der impliziten Version des perpendicular cs und xslant. So muss ich keine Schnittstellen ermitteln. Der folgende Code-Schnipsel zeichnet diese schrägen Linien und platziert gleichzeitig noch zwei Koordinaten entlang dieser Linie, die ich später verwende um das nächste „Level“ von Linien zu zeichnen (die Waagrechten).

Open in Online-Editor
\foreach \r [evaluate={\xslant=\r==3?.5:-.5;}] in {1,3}{
  \foreach \c in {1,...,3}{
    (m-\r-\c) edge[xslant=\xslant]
      coordinate[pos=.3]   (@-\r-\c-1)
      coordinate[near end] (@-\r-\c-2)
    (m-\r-\c|-m-2-4)
    (@-\r-\c-1) edge ++ (left:2cm)
    (@-\r-\c-2) edge ++ (left:2cm)
  }
}

Möchtest du xslant vermeiden, könntest du auch

Open in Online-Editor
 (m-\r-\c) edge ([xshift=1cm]m-\r-\c|-m-2-4)

verwenden, was natürlich keinen Bezug mehr zu einem Winkel hat, wenn man nicht die vertikale Distanz zwischen den Reihen betrachtet.

Obwohl mittels xslant über die Beziehung

Open in Online-Editor
tan(<Winkel>) = <xslant>)

indirekt ein Winkel angeben wird, kannst du natürlich auch einfach keine Transformation nehmen und polare Koordinaten verwenden und einen Schnittpunkt finden. Da wir nur den Schnittpunkt zwischen zwei Geraden finden wollen, brauchen wir nicht mal die intersections-Library, sondern können das intersection cs bzw. die implizite Version verwenden.

Implizit (intersection of <p1>--<p2> and <p3>--<p4>):

Open in Online-Editor
(m-\r-\c) edge           coordinate[pos=.3]   (@-\r-\c-1) coordinate[near end] (@-\r-\c-2)
(intersection of {m-1-1|-m-2-4}--m-2-4 and m-\r-\c--{[shift=({(\r-2)*63.44}:1cm)]m-\r-\c})

Die explizite Version wäre

Open in Online-Editor
(intersection cs: first line={(m-1-1|-m-2-4)--(m-2-4)},
                 second line={(m-\r-\c)--([shift=({(\r-2)*63.44}:1cm)]m-\r-\c)}

Das praktische bei dieser Schnittstellenfindelösung ist, dass die beiden Linien sich nicht mal überschneiden (geschweige denn vorher bereits definiert und benannt werden) müssen. Deshalb kann ich bei der zweiten Linie einfach noch mal die Node (m-\r-\c) aber mit einem polaren Shift kleiner Länge angeben.


Weitere Linien können jetzt mithilfe der Koordinaten entlang der schrägen Edges gezeichnet werden. Die xslant-Option kann jetzt allerdings nicht an der edge angebracht werden, sondern an der Zielkoordinate:

Open in Online-Editor
\foreach \prt in {1,2}{
  (@-1-1-\prt) --
    coordinate[pos=.3]   (@1-\prt)
    coordinate[near end] (@2-\prt) ++ (left:2cm)
  (@1-\prt) edge ++ ([xslant=-.5]up:.8cm)
  (@2-\prt) edge ++ ([xslant=-.5]up:.8cm)
}

Daraus kann man schon mal eine anständige Grafik erstellen. Text kann entlang von Linien wie immer angebracht werden: (<Koord 1>) edge node {EU} (<Koord 2>)
Weitere Linien können dann auch nach dem gleichen Schema angebracht werden.

Sollen alle Linien mit weiteren Linien (und nicht nur die oben links) ausgestattet werden, bietet sich eine rekursive Lösung an. Mit ein paar zusätzlichen Styles in Abhängigkeit von Level und Ursprungszellenbezeichnung, lässt sich diese auch relativ einfach wiederum individuell anpassen.

Oder man macht’s doch ganz anders …

Code

Open in Online-Editor
\documentclass[tikz]{standalone}
\usetikzlibrary{arrows,shapes.geometric,positioning,matrix}
\tikzset{
  ishikawa/.style={align=center, inner sep=0pt},
  matter/.style  ={rectangle, minimum size=6mm, very thick, draw=red!70!black!40,
    top color=white, bottom color=red!50!black!20, font=\itshape},
  level_1/.style ={ellipse, node distance=60pt, minimum size=6mm, very thick,
    draw=red!50!black!50, top color=white, bottom color=red!50!black!20, font=\itshape},
  level_2/.style={rectangle, minimum size=6mm, font=\itshape, font=\tiny}}
\tikzset{
  rows/.style 2 args={@/.style={row ##1/.style={#2}},@/.list={#1}},
  cols/.style 2 args={@/.style={column ##1/.style={#2}},@/.list={#1}},
}
\begin{document}
\begin{tikzpicture}
\matrix[
  matrix of nodes,
  row sep=3cm,
  column sep=1cm,
  rows={1,3}{nodes=level_1},
  rows=2{nodes=matter,anchor=center}
] (m) {
Material & Maschine & Messtechnik & \\
         &          &             & CPA \\
Methode  & Mensch   & Mitwelt     & \\
};
\path[very thick,
  to arr/.style={->, shorten <=+0pt, shorten >=+.1cm},
  fr arr/.style={<-, shorten >=+0pt, shorten <=+.1cm}]
  [to arr]
  (m-1-1|-m-2-4) edge (m-2-4)
  \foreach \r [evaluate={\xslant=\r==3?.5:-.5;}] in {1,3}{
    \foreach \c in {1,...,3}{
      (m-\r-\c) edge[xslant=\xslant]
        coordinate[pos=.3]   (@-\r-\c-1)
        coordinate[near end] (@-\r-\c-2) (m-\r-\c|-m-2-4)
      [fr arr]
      (@-\r-\c-1) edge ++ (left:2cm)
      (@-\r-\c-2) edge ++ (left:2cm)
    }
  }
  \foreach \prt in {1,2}{
  (@-1-1-\prt) --
    coordinate[pos=.3]   (@1-\prt)
    coordinate[near end] (@2-\prt) ++ (left:2cm)
  [fr arr]
  (@1-\prt) edge ++ ([xslant=-.5]up:.8cm)
  (@2-\prt) edge ++ ([xslant=-.5]up:.8cm)
  };
\end{tikzpicture}
\end{document}

Output

alt text

Permanenter link

beantwortet 17 Jun '15, 21:17

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k3815
Akzeptiert-Rate: 53%

Hallo, ich würde Deinen Code unter "Oder man macht’s doch ganz anders …" gerne in meiner Abschlussarbeit nutzen. Leider habe ich bisher kaum Erfahrung mit tikzpicture sammeln können und finde keine Möglichkeit die Pfeile zu beschriften. Wenn ich Dein Beispiel richtig verstehe, werden die waagerechten Pfeile in der letzten foreach-Schleife gebaut. Du schreibst, dass mit "() edge node {EU} ()" die Linien beschriftet werden können - muss ich die Koordinaten explizit nennen? Wenn ja, wie? Ein Beispielcode würde mir sehr weiterhelfen. Vielen Dank schon im Voraus :)

(29 Nov '16, 10:29) muskelkater

Du könntest generell einen Baum machen, der nach links wächst. Hier hast Du die Knoten manuell gesetzt. Geht natürlich auch.

Für Pfeile könntest Du einen Winkel vorgeben und damit einen nicht sichtbaren Pfad produzieren, den Schnittpunkt bestimmen, und dann einen Pfeil zum Schnittpunkt hin zeichnen.

Sowas wie:

Open in Online-Editor
\path [name path = Unterpfad] \Knoten -- ++(\Winkel:\Abstand);% Hilfslinie im Winkel
\path [name intersections={of = Hauptpfad and Unterpfad, by = Schnitt}];% Schnitt bilden
\draw \Knoten -- (Schnitt);% Pfeil vom Knoten zum Schnittpunkt mit Hauptpfad

Auch den neuen Pfeilen könnte man mit name path= Namen geben und erneut Schnitte machen.

Einmal an Deinem Dokument mit minimalen Änderungen (minimum width für Knoten z.B.), kompakt mit for-Schleife:

Open in Online-Editor
\documentclass[a4paper]{article} 
\usepackage[landscape]{geometry}
\usepackage{tikz}
\usetikzlibrary{arrows,shapes,positioning,intersections}
\begin{document}
  \tikzset{
      ishikawa/.style = {align=center, inner sep=0pt, text centered,
        %font=\sffamily
        },
      matter/.style={       % Wirkung=Betrachtete Störgröße
      rectangle,minimum size=6mm,very thick,draw=red!70!black!40,top color=white,
      bottom color=red!50!black!20,font=\itshape
      },
      level_1/.style={              % Haupteinflussfaktoren
      ellipse,node distance=60pt,minimum size=6mm,very thick,draw=red!50!black!50,
      top color=white,bottom color=red!50!black!20,font=\itshape,minimum width=3cm
      },
      level_2/.style={              % Nebeneinflussfaktoren
      rectangle,minimum size=6mm,font=\itshape,font=\tiny
      }
    }
    \begin{tikzpicture}[->,>=stealth',level/.style={sibling distance = 5cm/#1,
      level distance = 1.5cm}
    ]
            \node (Grund)           [matter]        at ( 15,0)              {CPA};
            %       \path[draw,->] (0,0) -- (Grund)
                    \draw [name path=Hauptpfad,->,very thick] ( 0,0) -- (Grund);
            \node (tl_1_1)          [level_1]       at ( 0,5)               {Material};
            \node (bl_1_1)          [level_1]       at ( 0,-5)              {Methode};
            %       child{ node [level_2] {msndfbdejfsdlfksf}}
            \node (tl_1_2)          [level_1, right=of tl_1_1]      {Maschine};
            %       child{ node [level_2] {msndfbdejfsdlfksf}}
            \node (bl_1_2)          [level_1, right=of bl_1_1]      {Mensch};
    %               child{ node [level_2] {msndfbdejfsdlfksf}}
            \node (tl_1_3)          [level_1, right=of tl_1_2]      {Messtechnik};
            %       child{ node [level_2] {msndfbdejfsdlfksf}}
            \node (bl_1_3)          [level_1, right=of bl_1_2]      {Mitwelt};
    %               child{ node [level_2] {msndfbdejfsdlfksf}}
    \newcommand*{\w}{60}% Grundwinkel
    \newcommand*{\Abstand}{20}% abstand
    \foreach \Knoten/\Winkel in {(tl_1_1)/-\w, (tl_1_2)/-\w, (tl_1_3)/-\w,
      (bl_1_1)/\w, (bl_1_2)/\w, (bl_1_3)/\w} {
      \path [name path = Unterpfad] \Knoten -- ++(\Winkel:\Abstand);% Hilfslinie im Winkel
      \path [name intersections={of = Hauptpfad and Unterpfad, by = Schnitt}];% Schnitt bilden
      \draw \Knoten -- (Schnitt);% Pfeil vom Knoten zum Schnittpunkt mit Hauptpfad
    }
    \end{tikzpicture}
\end{document}

Ishikawa-Diagramm

Permanenter link

beantwortet 17 Jun '15, 14:42

stefan's gravatar image

stefan ♦♦
18.3k163148
Akzeptiert-Rate: 49%

Wenn Du gleich alles in einer Matrix zeichnest, wie @Qrrbrbirlbel vorschlug, mit nodes in empty cells, könntest Du die leeren Knoten als Bezugspunkte für die weiteren kleinen waagerechten Pfeile nehmen. Ich hab nur im Augenblick nicht die Zeit zum Umschreiben. Vielleicht jemand anders?

(17 Jun '15, 14:45) stefan ♦♦

Hallo, vielen dank für eure raschen Antworten sowie die erarbeiteten Lösungsvorschläge. Genau das erstellt mir meinen gewünschten Output. Jedoch geht das ein Stück weit über meine Latex-Tikz Kentnisse darüber hinaus. Da mich diese Thematik jedoch brennend interresiert werde ich mich, so schnell es mir möglich ist, damit beschäftigen und euch Rückmeldung geben. Gruß Gerold

(18 Jun '15, 07:50) gerold
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×731
×54

gestellte Frage: 16 Jun '15, 16:21

Frage wurde gesehen: 26,300 Mal

zuletzt geändert: 29 Nov '16, 10:29