Zweite Version

Zweite Version

Ich habe zwei Diagramme (beide sollen gleich sein), eines mit expliziten Zeichen- und Knotenbefehlen, das andere mit foreachSchleifen. Offensichtlich verstehe ich Foreach-Schleifen nicht, da ich nur eine zum Laufen bekomme. Ich habe das Tikz-Tutorial befolgt, aber es ist mir schnell zu viel geworden. Ich versuche, die Tikz-Logik durch Ausprobieren zu verstehen, aber ich bin ein wenig entmutigt, nachdem ich scheinbar einfache Dinge ausprobiert habe. Bei den anderen brauche ich Hilfe. Ich bitte um einen Anstoß in die richtige Richtung, wie ich das machen soll. Wie müsste ich meine Schleifen gestalten, um den Code des ersten Diagramms zu verkürzen. Das zweite funktioniert nicht, wenn die Zeilen kommentiert sind.

\documentclass{article}
\usepackage[margin=20mm]{geometry}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\draw (0,0) rectangle +(10.5,8);
\draw (0.1,0.1) rectangle +(10.3,7.8);
\foreach \x in {1.5,4,6.5,9}
    \foreach \y in {1.5,4,6.5}
        \draw (\x,\y) circle (1);

\node at (1.5,1.5) {PreA30};
\node at (1.5,4) {PreB30};
\node at (1.5,6.5) {PreC30};

\node at (4,1.5) {PreA50};
\node at (4,4) {PreB50};
\node at (4,6.5) {PreC50};

\node at (6.5,1.5) {PreA70};
\node at (6.5,4) {PreB70};
\node at (6.5,6.5) {PreC70};

\node at (9,1.5) {PreA90};
\node at (9,4) {PreB90};
\node at (9,6.5) {PreC90};

\node at (1.5,-.5) {30\%};
\node at (4,-.5) {50\%};
\node at (6.5,-.5) {70\%};
\node at (9,-.5) {90\%};
\node at (-.5,1.5) {A};
\node at (-.5,4) {B};
\node at (-.5,6.5) {C};
\end{tikzpicture}

\begin{tikzpicture}
\draw (0,0) rectangle +(10.5,8);
\draw (0.1,0.1) rectangle +(10.3,7.8);

\foreach \x in {1.5,4,6.5,9}
    \foreach \y in {1.5,4,6.5}
        \draw (\x,\y) circle (1);

% the next block actually compiles, but the result is quite alarming
% I tried a different order, but that doesn't seem to matter at all
%\foreach \x in {1.5,4,6.5,9}
%   \foreach \y in {1.5,4,6.5}
%       \foreach \sam in {A,B,C}
%           \foreach \perc in {30,50,70,90}
%               \node at (\x,\y) {Pre\sam\perc};
%
%\foreach \x in {1.5,4,6.5,9}
%   \foreach \perc in {30,50,70,90}
%       \node at (\x,-.5) {\perc\%};
%
%\foreach \y in {1.5,4,6.5}
%   \foreach \sam in {A,B,C}
%       \node at {-.5,\y} {\sam};
\end{tikzpicture}

\end{document}

Mit Marmots Antwort erhalten wir das, was im Bild unten zu sehen ist. Das erste Diagramm ist das gewünschte. Das zweite Diagramm weist in allen Knoten Textüberlagerungen auf. Ich weiß, dass dies wahrscheinlich mehr mit Logik als mit LaTeX zu tun hat, aber ich komme trotzdem nicht ganz dahinter, wie die For-Schleifen richtig gestaltet werden sollen. erwünschte und unerwünschte Wirkung

Antwort1

Sie haben vier verschachtelte Schleifen, obwohl Sie nur zwei wollen, aber Sie benötigen mehr als eine Schleifenvariable. Das geht beispielsweise mit

\foreach \x/\perc in {1.5/30,4/50,6.5/70,9/90}

d. h. jedes Element in der Variablenliste enthält zwei durch getrennte Werte /.

In Bezug auf Ihren ursprünglichen Code funktionieren die Schleifen einwandfrei. Das einzige Problem besteht darin, dass Sie im endgültigen Code \node at {-.5,\y} {\sam};anstelle von verwendet haben. (Geschweifte Klammern statt runder Klammern in der Koordinate.) Wenn Sie das beheben, tritt das Problem des Überdruckens auf, da Sie für jedes Paar von / -Werten 12 Knoten drucken: Drei verschiedene Buchstaben (A, B, C) und vier verschiedene Zahlen (30, 50, 70, 90) ergeben 12 Kombinationen.\node at (-.5,\y) {\sam};\x\y

\documentclass{article}
\usepackage[margin=20mm]{geometry}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\draw (0,0) rectangle +(10.5,8);
\draw (0.1,0.1) rectangle +(10.3,7.8);
\foreach \x in {1.5,4,6.5,9}
    \foreach \y in {1.5,4,6.5}
        \draw (\x,\y) circle (1);

\node at (1.5,1.5) {PreA30};
\node at (1.5,4) {PreB30};
\node at (1.5,6.5) {PreC30};

\node at (4,1.5) {PreA50};
\node at (4,4) {PreB50};
\node at (4,6.5) {PreC50};

\node at (6.5,1.5) {PreA70};
\node at (6.5,4) {PreB70};
\node at (6.5,6.5) {PreC70};

\node at (9,1.5) {PreA90};
\node at (9,4) {PreB90};
\node at (9,6.5) {PreC90};

\node at (1.5,-.5) {30\%};
\node at (4,-.5) {50\%};
\node at (6.5,-.5) {70\%};
\node at (9,-.5) {90\%};
\node at (-.5,1.5) {A};
\node at (-.5,4) {B};
\node at (-.5,6.5) {C};
\end{tikzpicture}

\begin{tikzpicture}
\draw (0,0) rectangle +(10.5,8);
\draw (0.1,0.1) rectangle +(10.3,7.8);

\foreach \x/\perc in {1.5/30,4/50,6.5/70,9/90}
   { % here you need to use braces, because there is more than one thing in the loop
   \node at (\x,-0.5) {\perc\%};
   \foreach \y/\sam in {1.5/A,4/B,6.5/C}
       {
       \draw (\x,\y) circle (1);
       \node at (\x,\y) {Pre\sam\perc};
       }
   }

% second loop for y-labels
\foreach \y/\sam in {1.5/A,4/B,6.5/C}
   \node at (-0.5,\y) {\sam};

\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Zweite Version

Es gibt weitere verfügbare Optionen für \foreach, wie in Kapitel 83 in beschriebendas Handbuch. In einem Fall wie diesem mit regelmäßig angeordneten Knoten kann es sinnvoll sein, die countOption zu verwenden, die Ihnen einen Zähler für die Schleifenvariable gibt. Außerdem können Sie evaluatedamit Berechnungen durchführen.

Auf diese Weise können Sie für jede Schleife nur eine Schleifenvariable haben und die Koordinaten basierend auf der Iteration berechnen, in der Sie sich in der Schleife befinden. Die Ausgabe ist wie oben.

\documentclass{article}
\usepackage[margin=20mm]{geometry}
\usepackage{tikz}
\usetikzlibrary{fit, backgrounds}
\begin{document}

\begin{tikzpicture}

\foreach [count=\i, evaluate={\x=\i*2.5}] \perc in {30,50,70,90}
   { % here you need to use braces, because there is more than one thing in the loop
   \foreach [count=\j, evaluate={\y=\j*2.5}] \sam in {A,B,C}
       {
       \node [circle,draw,minimum size=2cm] (\sam\perc) at (\x,\y) {Pre\sam\perc};
       \ifnum \i=1
         \node [left=5mm] at (\sam30.west) {\sam};
       \fi
       } % inner loop ends here
   % so this node is only in outer loop
   \node [below=5mm] at (A\perc.south) {\perc\%};
   }

\begin{scope}[on background layer]
  % fit both around same nodes, with different inner sep
  \node[draw,fit=(A30)(C90),inner sep=3mm, fill=blue!20] (frame) {}; % outer frame, larger inner sep
  \node[draw,fit=(A30)(C90),inner sep=2mm, fill=red!20] (frame) {}; % inner frame, smaller inner sep
\end{scope}
\end{tikzpicture}
\end{document}

wie oben mit gefülltem Hintergrundrahmen

Antwort2

Ich weiß, dass es in dieser Frage um geht foreach, aber wenn jemand Probleme hat, foreachdie Verwendung zu verstehen, kann dieses Diagramm mithilfe einer matrixHilfe leicht reproduziert werden:

\documentclass[tikz,border=2mm]{standalone} 
\usetikzlibrary{positioning, matrix, fit}

\begin{document}
\begin{tikzpicture}

\matrix[matrix of nodes,
            nodes={anchor=center, 
                circle, draw, minimum size=2cm},
            column 1/.style={%
                nodes={rectangle, minimum size=0pt, draw=none}},
            row 4/.style={%
                nodes={rectangle, minimum size=0pt, draw=none}},
            column sep=5mm, row sep=5mm]
(top)
{
C & PreC30 & PreC50 & PreC70 & PreC90 \\
B & PreB30 & PreB50 & PreB70 & PreB90 \\
A & PreA30 & PreA50 & PreA70 & PreA90 \\
  & 30\% & 50\% & 70\% & 90\% \\
};
\node[draw, double, fit=(top-1-2) (top-3-5), inner sep=3mm] {};
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Antwort3

Wenn Sie Schleifen verwenden, \foreachmüssen Sie alles, was in der Schleife enthalten sein soll, in eine Gruppe setzen, d. h. es umgeben, es {sei }denn, Sie haben nur einen Befehl/eine Gruppe in der Schleife. Wenn Sie dies auf Ihren Code anwenden, erhalten Sie

\documentclass{article}
\usepackage[margin=20mm]{geometry}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\draw (0,0) rectangle +(10.5,8);
\draw (0.1,0.1) rectangle +(10.3,7.8);
\foreach \x in {1.5,4,6.5,9}
    \foreach \y in {1.5,4,6.5}
        \draw (\x,\y) circle (1);

\node at (1.5,1.5) {PreA30};
\node at (1.5,4) {PreB30};
\node at (1.5,6.5) {PreC30};

\node at (4,1.5) {PreA50};
\node at (4,4) {PreB50};
\node at (4,6.5) {PreC50};

\node at (6.5,1.5) {PreA70};
\node at (6.5,4) {PreB70};
\node at (6.5,6.5) {PreC70};

\node at (9,1.5) {PreA90};
\node at (9,4) {PreB90};
\node at (9,6.5) {PreC90};

\node at (1.5,-.5) {30\%};
\node at (4,-.5) {50\%};
\node at (6.5,-.5) {70\%};
\node at (9,-.5) {90\%};
\node at (-.5,1.5) {A};
\node at (-.5,4) {B};
\node at (-.5,6.5) {C};
\end{tikzpicture}

\begin{tikzpicture}
\draw (0,0) rectangle +(10.5,8);
\draw (0.1,0.1) rectangle +(10.3,7.8);

\foreach \x in {1.5,4,6.5,9}
    {\foreach \y in {1.5,4,6.5}
        \draw (\x,\y) circle (1);}

% the next block actually compiles, but the result is quite alarming
% I tried a different order, but that doesn't seem to matter at all
\foreach \x in {1.5,4,6.5,9}
  {\foreach \y in {1.5,4,6.5}
      \foreach \sam in {A,B,C}
          {\foreach \perc in {30,50,70,90}
              \node at (\x,\y) {Pre\sam\perc};}}

\foreach \x in {1.5,4,6.5,9}
  {\foreach \perc in {30,50,70,90}
      \node at (\x,-.5) {\perc\%};}

\foreach \y in {1.5,4,6.5}
  {\foreach \sam in {A,B,C}
      \node at (-.5,\y) {\sam};}
\end{tikzpicture}

\end{document}

Der Code gibt Ihnen jetzt, was Sie meiner Meinung nach erreichen wollten.

verwandte Informationen