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: 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 |
Hier ein Vorschlag mit einer 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 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 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 Implizit 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 Weitere Linien können jetzt mithilfe der Koordinaten entlang der schrägen Edges gezeichnet werden. Die 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: 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 … CodeOpen 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} Outputbeantwortet 17 Jun '15, 21:17 Qrrbrbirlbel 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 "(
(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 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} beantwortet 17 Jun '15, 14:42 stefan ♦♦ Wenn Du gleich alles in einer Matrix zeichnest, wie @Qrrbrbirlbel vorschlug, mit
(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
|
Ursprünglich von LaTeX-community
Crosspost auf TeX.SX
Wie allgemein muss das Diagramm denn gezeichnet werden?
positioning
ohne dieon 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.