Ich bin mir nicht ganz sicher ob der Titel gut gewählt ist, Vorschläge sind gern willkommen.

Ich frage mich was der beste Weg ist um die Pfeile im angehängten Bild zu kreieren. Das Wichtigste ist, dass der Pfeil von Zelle (1,3) der Untermatrix losgeht und zu Zelle (1,1) einer anderen Untermatrix in der nächsten Spalte geht.

Das hier ist mein Beispielcode:

\documentclass[tikz]{standalone}
\usetikzlibrary{matrix}
\begin{document}

\newcommand{\myfigure}[0]{%
\begin{tikzpicture}[line width=0.4mm, scale=1]

\def \lrW {3}       %Number of columns
\def \lrH {3}       %Number of lines
\definecolor{data}{HTML}{e3e3e3} % gray color
\def \height {1.0} %height
\def \width {1.0} %width

% building submatrix
\draw [draw=black, fill = data] (0,0) rectangle +(\lrW*\width,\lrH*\height);
\draw [thin, color=gray] (0.01,0.01) grid [xstep=1*\width cm,ystep=\height cm]+(\lrW*\width-0.02,\lrH*\height-0.02);
\end{tikzpicture}
}
\begin{tikzpicture}
\matrix [matrix of nodes, nodes in empty cells, column sep=1cm,row sep=1cm] (ae) {

Text & \myfigure & \myfigure & \myfigure & \myfigure & \\
Text & \myfigure & \myfigure & \myfigure & \myfigure & \dots \\
Text & \myfigure & \myfigure & \myfigure & \myfigure & \\
 & Text & Text & Text & Text \\
 & Text & Text & Text & Text \\ };
\end{tikzpicture}
\end{document}

Erst hatte ich gedacht ich könnte mir neue Anchor setzen, dann dachte ich mir, dass ich in \myfigure zwei Koordinaten für Ausgang und Eingang eines möglichen Pfeils setzen kann und diese dann irgendwie sinnvoll ansprechen kann, wie bspw. für die Zeichnung:

\draw[->] (ae-1-1-Ausgang) -- (ae-2-2-Eingang);
\draw[->] (ae-2-1-Ausgang) -- (ae-1-2-Eingang);
\draw[->] (ae-3-1-Ausgang) -- (ae-3-2-Eingang);
...

Würde das gehen, oder geht das vielleicht sogar viel einfacher?

Matrix

gefragt 17 Okt '19, 13:33

skybeat's gravatar image

skybeat
4139
Akzeptiert-Rate: 0%

bearbeitet 17 Okt '19, 16:21

Kannst Du ein Beispiel für die Zeichnung anbieten, in die diese Pfeile eingefügt werden sollen? Ich meinte hier kürzlich gelesen zu haben, es wäre wieder möglich, Bilder anzuhängen.

(17 Okt '19, 14:25) Bartman

Habe eine Beispielgrafik angehängt. Sieht man wenigstens die Zeichnung im Link?

(17 Okt '19, 15:07) skybeat
1

Ich hänge es gleich rein.

(17 Okt '19, 15:18) stefan ♦♦

Ist erledigt

(17 Okt '19, 15:33) stefan ♦♦

@skybeat Die Beantwortung ist kein Problem. Haben die \myfigures's alle die gleichen Dimensionen und sind nicht befüllbar? Dann sehe ich noch Vereinfachungspotential.

(17 Okt '19, 16:05) haver555

@haver555 Die Matrix of nodes besteht nicht komplett aus diesen Matritzen. In der ersten Spalte und den letzten beiden Zeilen ist jeweils Beschriftung. Und die letzte Spalte beinhaltet "...", da dieses Schema mit den Pfeilen eigentlich weitergehen würde, ich es aber mit den "..." abkürzen möchte. Ich habe das Beispiel angepasst um es besser zu zeigen. Was meinst du mit nicht befüllbar?

(17 Okt '19, 16:17) skybeat

@skybeat Egal, ich habe die Optionalitäten offen gelassen; siehe meine AW.

(17 Okt '19, 18:20) haver555
Ergebnis 5 von 7 show 2 more comments

1. Antwort: Subfiguren als Zusammensetzung koordinatentragender nodes.


Ich empfehle für die Subfiguren Gebilde mit Koordinaten zu verwenden.
Da sich TikZ-Matrizen scheints nicht in andere TikZ-Matrizen nesten lassen, muss man sich sowas selbst erstellen:

\newcommand{\mysubfigure}[1]{%%%%
\node{}; % Will er unbedingt
\foreach \y in {1,...,\Rows} 
\foreach \x in {1,...,\Cols} 
\node[draw,  
fill=lightgray, font=\tiny, %thin, 
xshift=\x*\width cm-1cm, yshift=-\y*\height cm+1cm,  % verbessert²
minimum width=\width cm, minimum height=\height cm] (#1-\y-\x) {
\ifnum\BeschriftungAnzeigen=1 #1:\y,\x \else\fi};
}%%%%

Damit sind die Pfeile dann kein Problem
\draw[Pfeil] (I-1-3) -- (J-1-1); \draw[Pfeil] (E-1-3.east) -- ([xshift=1em]E-1-3.east) -- ([xshift=-1em]B-1-1.west) -- (B-1-1.west);
usw.

alt text

Mit der Einstellung \def\BeschriftungAnzeigen{0}

alt text

(Bilder hochladen geht hier nicht, also als googledrive-Link. Ob das so gedacht ist? Vermutlich nicht....)

\documentclass[tikz]{standalone}
\usetikzlibrary{matrix}

\begin{document}
\pgfmathtruncatemacro\Rows{4} % Number of lines
\pgfmathtruncatemacro\Cols{3} % Number of columns
\def\height {1.0} %height
\def\width {1.0} %width
\def\BeschriftungAnzeigen{1} % 1   0

\newcommand{\mysubfigure}[1]{%%%%
\node{}; % Will er unbedingt
\foreach \y in {1,...,\Rows} 
\foreach \x in {1,...,\Cols} 
\node[draw,  
fill=lightgray, font=\tiny, %thin, 
xshift=\x*\width cm, yshift=-\y*\height cm, 
minimum width=\width cm, minimum height=\height cm] (#1-\y-\x) {
\ifnum\BeschriftungAnzeigen=1 #1:\y,\x \else\fi};
}%%%%

\begin{tikzpicture}
\matrix [matrix of nodes, nodes in empty cells, 
%ampersand replacement=\&, 
column sep=1cm,row sep=1cm] (ae) {
\mysubfigure{A} & \mysubfigure{B} & \mysubfigure{C} & \mysubfigure{D} \\ 
\mysubfigure{E} & \mysubfigure{F} & \mysubfigure{G} & \mysubfigure{H} \\ 
\mysubfigure{I} & \mysubfigure{J} & \mysubfigure{K} & \mysubfigure{L} \\ 
%\myfigure & \myfigure & \myfigure & \myfigure & \\
};

% Pfeile
\tikzset{Pfeil/.style={->, rounded corners, thick}}

\draw[Pfeil] (A-1-3.east) -- ([xshift=1em]A-1-3.east) -- ([xshift=-1em]F-1-1.west) -- (F-1-1.west);

\draw[Pfeil] (E-1-3.east) -- ([xshift=1em]E-1-3.east) -- ([xshift=-1em]B-1-1.west) -- (B-1-1.west);

\draw[Pfeil] (I-1-3) -- (J-1-1);

\draw[Pfeil] (J-1-3.east) -- ([xshift=1em]J-1-3.east) -- ([xshift=-1em]G-1-1.west) -- (G-1-1.west);

\draw[Pfeil] (K-1-3.east) -- ([xshift=1em]K-1-3.east) -- ([xshift=-1em]D-1-1.west) -- (D-1-1.west);

% .... 
\end{tikzpicture}

\end{document}
Permanenter link

beantwortet 17 Okt '19, 18:19

haver555's gravatar image

haver555
199512
Akzeptiert-Rate: 9%

bearbeitet 20 Okt '19, 11:39

Das sieht ziehmlich gut aus. Aber was, wenn die Submatrix so bleibt, wie ich sie gemacht habe? Mein Weg erscheint mir jetzt recht umständlich, aber würde das auch irgendwie gehen? Ich meine, meinen Vorschlag mit den 2 Koordinaten in der Submatrix setzen für Eingang/Ausgang und dann die Pfeile einfach von Ausgang der einen Matrix zum Eingang der anderen Matrix ziehen.

(18 Okt '19, 01:26) skybeat

Verbesserung
xshift=\x*\width cm-1cm, yshift=-\y*\height cm+1cm, % verbessert²
für das Zusammenspiel mit Text-Einträgen in der TikZ-Matrix vorgenommen.

(18 Okt '19, 19:30) haver555

Mein Vorschlag übernimmt den Quelltext Deiner Matrix weitgehend.

\documentclass[tikz]{standalone}
\usetikzlibrary{matrix, arrows.meta, calc}

\begin{document}
\newcommand{\myfigure}{%
    \begin{tikzpicture}[line width=0.4mm]
    \def \lrW {3}       %Number of columns
    \def \lrH {3}       %Number of lines
    \definecolor{data}{HTML}{e3e3e3} % gray color
    \def \height {1.0} %height
    \def \width {1.0} %width

    % building submatrix
    \draw [draw=black, fill=data] 
        (0,0) rectangle +(\lrW*\width,\lrH*\height)
    ;
    \draw [thin, color=gray, xstep=\width cm, ystep=\height cm]
        (0.01,0.01) grid +(\lrW*\width-0.02,\lrH*\height-0.02)
    ;
    \end{tikzpicture}
}
\begin{tikzpicture}[
    >={Latex[length=3mm]},
    font=\sffamily% für serifenlose Schrift
]
\matrix [
    matrix of nodes, 
    nodes in empty cells, 
    column sep=2cm,
    row sep=1cm,
    row 1/.style={anchor=center},
    row 2/.style={anchor=center},
    row 3/.style={anchor=center}
] (ae) {
    Text & \myfigure & \myfigure & \myfigure & \myfigure & \\
    Text & \myfigure & \myfigure & \myfigure & \myfigure & $\cdots$ \\
    Text & \myfigure & \myfigure & \myfigure & \myfigure & \\
         & Text      & Text      & Text      & Text \\
         & Text      & Text      & Text      & Text \\ 
};

\foreach \row in {1,2,3}{
    \foreach \col in {2,3,4,5}{
        \coordinate (ae-\row-\col-e) 
            at ($(ae-\row-\col.north west)!1/6!(ae-\row-\col.south west)$)
        ;
        \coordinate (ae-\row-\col-a) 
            at ($(ae-\row-\col.north east)!1/6!(ae-\row-\col.south east)$)
        ;
    }
}

\path [->] 
    (ae-1-2-a) edge [out=0, in=130] (ae-2-3-e)
    (ae-2-2-a) edge [out=60, in=200] (ae-1-3-e)
    (ae-3-2-a) edge (ae-3-3-e)
;
\end{tikzpicture}
\end{document}
Permanenter link

beantwortet 18 Okt '19, 02:02

Bartman's gravatar image

Bartman
1.6k13
Akzeptiert-Rate: 50%

bearbeitet 18 Okt '19, 06:29

Die row-styles sind überflüssig, oder? Ich möchte lieber fixe Koordinaten haben, als um (0, 1) zu shiften, weil das shiften funktioniert nicht mehr, wenn sich die Dimensionen width, height, lrW, lrH verändern, richtig?

Kann ich mir auch jeweils 2 Koordinaten in den Submatritzen setzen, zwischen denen ich dann die Pfeile ziehen kann? In dem konkreten Fall eine Koordinate bei (0, 2.5) und eine bei (3, 2.5). Und dann ziehe ich einen Pfeil bspw. von Matrix A Koordinate (3, 2.5) zu Matrix B Koordinate (0, 2.5).

(18 Okt '19, 02:23) skybeat

Wenn Du die Zeilenstile weglässt, werden die Beschriftungen am unteren Rand ausgerichtet.

In meinem überarbeiteten Beispiel werden die Koordinaten für die Ein- und Ausgabe weiterhin nicht während des Zeichnens der Matrizen gesetzt. Dafür erzeuge ich nun aber nachträglich die gewünschten Koordinaten, damit diese nur noch verbunden werden müssen.

(18 Okt '19, 06:43) Bartman

Ich habe deine Version in meiner Antwort abgeändert um noch eine Frage dazu zu formulieren.

(18 Okt '19, 12:56) skybeat

@skybeat Ich habe den letzten Beitrag, der ja keine eigentliche Antwort auf die Frage ist, in eine neue Frage umgewandelt: Koordinaten in Submatrix von matrix of nodes.

(18 Okt '19, 12:57) stefan ♦♦

Oh, ok, entschuldige. Ich versuch das beim nächsten Mal gleich richtig zu machen.

(18 Okt '19, 13:09) skybeat

@skybeat Kein Problem :-) hier ist halt Frage-Antwort-Format mit Sortierung nach Stimmen und nicht chronologisch, ist ungewohnt für Webforen.

(18 Okt '19, 13:11) stefan ♦♦
Ergebnis 5 von 6 show 1 more comments

2. Antwort: Subfiguren als nodes, nur benötigte Ansteuerung von Koordinaten.


Zwar erlaubt die TikZ-Matrix auch Pfade als Einträge; andererseits handelt es sich um eine matrix of nodes, also ist es sinnvoll, das Layout der Subfiguren auch als node umzusetzen.
Insbesondere sollten verschiedene tikzpictures nicht vernestet werden; die Methode dafür ist m.W. path picture={...}.

Die Syntax für nodes in der matrix ist |[<Optionen>]| <Text>, also sieht das Kommando so aus:

\newcommand{\mysubfigure}[1]{%%%%
|[name=#1, rectangle, draw, fill=lightgray, 
text width=\Cols*\width cm, text height=\Rows*\height cm, 
yshift=-0.5*\Rows*\height cm, % für Zusammenspiel mit Text
text=red, font=\sffamily\Large, % font=\tiny, 
]   
[inner sep=0pt,   path picture={
\draw[xstep=\width cm, ystep=\height] (path picture bounding box.south west) grid (path picture bounding box.north east);
}]| \ifnum\BeschriftungAnzeigen=1 #1\else\fi
}%%%%

alt text

\documentclass[tikz, margin=5pt]{standalone}
\usetikzlibrary{matrix}

\begin{document}
% Einstellen: 
\pgfmathtruncatemacro\Rows{3} % Number of lines
\pgfmathtruncatemacro\Cols{4} % Number of columns
\def\height{1.1} %height
\def\width{0.6} %width
\def\BeschriftungAnzeigen{1} % 1   0

\newcommand{\mysubfigure}[1]{%%%%
|[name=#1, rectangle, draw, fill=lightgray,
text width=\Cols*\width cm, text height=\Rows*\height cm, 
yshift=-0.5*\Rows*\height cm, % für Zusammenspiel mit Text
text=red, font=\sffamily\Large, % font=\tiny, 
]   
[inner sep=0pt,   path picture={
\draw[xstep=\width cm, ystep=\height] (path picture bounding box.south west) grid (path picture bounding box.north east);
}]| \ifnum\BeschriftungAnzeigen=1 #1\else\fi
}%%%%

\begin{tikzpicture}
\matrix [matrix of nodes, nodes in empty cells, 
left delimiter=(,right delimiter=), % optional
column sep=1.25cm,row sep=1cm,
] (m) {
Text & \mysubfigure{A} & \mysubfigure{B} & Text & \mysubfigure{C} \\ 
Text & \mysubfigure{D} & \mysubfigure{E} & Text & \mysubfigure{F} \\ 
Text & Text & \mysubfigure{G} & \mysubfigure{H} & Text \\ 
};

% Pfeile
\tikzset{Pfeil/.style={->, rounded corners, very thick}}
\pgfmathsetmacro{\h}{0.5*\height}

\draw[Pfeil]  ([shift={(0em,3*\h)}]G.south east) -- ([shift={(0em,3*\h)}]H.south west);

\draw[Pfeil] ([shift={(0em,5*\h)}]A.south east) -- ([shift={(1em,5*\h)}]A.south east) 
-- ([shift={(-1em,\h)}]E.south west) -- ([shift={(0,\h)}]E.south west);

\draw[Pfeil] ([shift={(0em,\h)}]D.south east) -- ([shift={(1em,\h)}]D.south east) 
-- ([shift={(-1em,5*\h)}]B.south west) -- ([shift={(0,5*\h)}]B.south west);

\draw[Pfeil] ([shift={(0em,\h)}]H.south east) -- ([shift={(1em,\h)}]H.south east) 
-- ([shift={(-1em,3*\h)}]C.south west) -- ([shift={(0,3*\h)}]C.south west);

\draw[Pfeil] ([shift={(0em,\h)}]E.south east) -- ([shift={(1em,\h)}]E.south east) 
-- ([shift={(-1em,5*\h)}]H.south west) -- ([shift={(0,5*\h)}]H.south west);
\end{tikzpicture}

\end{document}
Permanenter link

beantwortet 20 Okt '19, 11:38

haver555's gravatar image

haver555
199512
Akzeptiert-Rate: 9%

bearbeitet 20 Okt '19, 11:40

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:

×728
×58
×35

gestellte Frage: 17 Okt '19, 13:33

Frage wurde gesehen: 6,084 Mal

zuletzt geändert: 20 Okt '19, 11:40