pgfplots: Der beste Weg, um ein Patchwork-Diagramm zu zeichnen

Nov 22 2020

Update / Bemerkung

Nachdem ich im Chat einen Hinweis bekommen hatte, stellte ich auch hier die Frage (außerhalb vonhttps://tex.stackexchange.com/) und bekam einen alternativen Ansatz.


  • Dies ist eine Folgefrage dieser Frage .
  • Ich möchte ein Diagramm zeichnen, wie in der Handzeichnung gezeigt.
  • Die Idee ist es, einen Tisch zu schaffen , mit x, y, colorund ein labelfür jedes Rechteck.

Eingang

Die Eingabe könnte wie folgt aussehen. Dies sind nur allgemeine Vorschläge.

Version 1 (Absolutwerte)

x    y    color    label
% First Column
10   5    green    Labelx1y1
10   15   green    Labelx1y2
10   20   green    Labelx1y3
% Second Column
18   5    green    Labelx2y1
18   15   green    Labelx2y2
18   20   green    Labelx2y3
% Third Column
25   5    green    Labelx3y1
25   15   green    Labelx3y2
25   20   red      Labelx3y3 % RED rectangle

Version 1 (Relative Werte)

In diesem Beispiel werden die xWerte yundWerte hinzugefügt.

x    y    color    label
% First Column
10   5    green    Labelx1y1
10   10   green    Labelx1y2
10   5    green    Labelx1y3
% Second Column
8   5    green    Labelx2y1
8   10   green    Labelx2y2
8   5    green    Labelx2y3
% Third Column
7   5    green    Labelx3y1
7   10   green    Labelx3y2
7   5    red      Labelx3y3 % RED rectangle

Ausgabe

Hauptfrage und Bemerkungen

  • Frage: Hat dieser Diagrammtyp einen Namen?
  • Hauptfrage: Was wäre ein kluger Weg, um dies zu erreichen?
  • Bemerkung: Ich würde es vorziehen, zu verwenden pgfplots.
  • Anmerkung: Ich bin nicht mit einem bestimmten Eingabeformat verheiratet - ich generiere die Daten selbst (Matlab, Python, Excel) und kann sie daher beeinflussen.

Antworten

3 Noname Nov 22 2020 at 04:50

Hier ist eine sehr einfache Option. Verwenden Sie pgfplotstableund einfach Ti k Z, um die Daten in ein Diagramm zu konvertieren. Da es sehr einfach ist, kann es leicht angepasst werden. Der Preis, den Sie zahlen müssen, ist, dass Sie einige Dinge von Hand reparieren müssen

x=3mm,y=3mm,declare function={nrows=3;}

Hiermit werden die Einheiten und die Anzahl der Zeilen festgelegt. (Um fair zu sein, müssen Sie auch in einigen pgfplotsSzenarien die Anzahl der Zeilen oder Spalten explizit festlegen.)

\documentclass[tikz,border=3mm]{standalone}
\usepackage{pgfplotstable}
\begin{document}
\begin{tikzpicture}[x=3mm,y=3mm,declare function={nrows=3;}]
\pgfplotstableread{%
x    y    color    label
% First Column
10   5    green    Labelx1y1
10   15   green    Labelx1y2
10   20   green    Labelx1y3
% Second Column
18   5    green    Labelx2y1
18   15   green    Labelx2y2
18   20   green    Labelx2y3
% Third Column
25   5    green    Labelx3y1
25   15   green    Labelx3y2
25   20   red      Labelx3y3
}\dataA
\pgfplotstablegetrowsof{\dataA}%
\pgfmathtruncatemacro{\numrows}{\pgfplotsretval-1}%
\edef\lastx{0}%
\edef\lasty{0}%
\pgfplotsforeachungrouped\X in{0,...,\numrows} {%
\pgfplotstablegetelem{\X}{x}\of\dataA
\let\x\pgfplotsretval
\pgfplotstablegetelem{\X}{y}\of\dataA
\let\y\pgfplotsretval
\pgfplotstablegetelem{\X}{color}\of\dataA
\let\mycolor\pgfplotsretval
\pgfplotstablegetelem{\X}{label}\of\dataA
\let\mylabel\pgfplotsretval
\draw[fill=\mycolor] (\lastx,\lasty) rectangle (\x,\y) node[midway]{\mylabel};
\let\lasty\y
\pgfmathtruncatemacro{\itest}{Mod(\X+nrows+1,nrows)}%
\ifnum\itest=0\relax
\edef\lasty{0}%
\let\lastx\x
\fi
}
\end{tikzpicture}
\end{document}

Man kann dies tatsächlich einbetten pgfplots. Es gibt ein kleines Problem in Bezug auf die Erweiterung, daher die \edefund \noexpandTricks (siehe die Diskussion auf S. 545 des pgfplots-Handbuchs v1.17).

\documentclass[tikz,border=3mm]{standalone}
\usepackage{pgfplotstable}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\begin{document}
\begin{tikzpicture}[declare function={nrows=3;}]
\begin{axis}[width=12cm,title=Random title]
\pgfplotstableread{%
x    y    color    label
% First Column
10   5    green    Labelx1y1
10   15   green    Labelx1y2
10   20   green    Labelx1y3
% Second Column
18   5    green    Labelx2y1
18   15   green    Labelx2y2
18   20   green    Labelx2y3
% Third Column
25   5    green    Labelx3y1
25   15   green    Labelx3y2
25   20   red      Labelx3y3
}\dataA
\pgfplotstablegetrowsof{\dataA}%
\pgfmathtruncatemacro{\numrows}{\pgfplotsretval-1}%
\edef\lastx{0}%
\edef\lasty{0}%
\pgfplotsforeachungrouped\X in{0,...,\numrows} {%
\pgfplotstablegetelem{\X}{x}\of\dataA
\let\x\pgfplotsretval
\pgfplotstablegetelem{\X}{y}\of\dataA
\let\y\pgfplotsretval
\pgfplotstablegetelem{\X}{color}\of\dataA
\let\mycolor\pgfplotsretval
\pgfplotstablegetelem{\X}{label}\of\dataA
\let\mylabel\pgfplotsretval
\edef\temp{\noexpand\addplot[fill=\mycolor] coordinates {(\lastx,\lasty) (\lastx,\y)
(\x,\y) (\x,\lasty) (\lastx,\lasty)};
\noexpand\path (\lastx,\lasty) rectangle (\x,\y) node[midway]{\mylabel};}
\temp
\let\lasty\y
\pgfmathtruncatemacro{\itest}{Mod(\X+nrows+1,nrows)}%
\ifnum\itest=0\relax
\edef\lasty{0}%
\let\lastx\x
\fi
}
\end{axis}
\end{tikzpicture}
\end{document}