pgfplots: Der beste Weg, um ein Patchwork-Diagramm zu zeichnen
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
,color
und einlabel
fü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 x
Werte y
undWerte 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
Hier ist eine sehr einfache Option. Verwenden Sie pgfplotstable
und 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 pgfplots
Szenarien 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 \edef
und \noexpand
Tricks (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}
