pgfplots: meilleure façon de dessiner un diagramme «patchwork»
Mise à jour / remarque
Après avoir reçu un indice dans le chat, j'ai également posé la question ici (en dehors dehttps://tex.stackexchange.com/) et a obtenu une approche alternative.
- C'est une question complémentaire de cette question .
- Je veux dessiner un diagramme comme indiqué dans le dessin à la main.
- L'idée est de fournir une table
x
,y
,color
etlabel
pour chaque rectangle.
Contribution
L'entrée peut ressembler à ce qui suit. Ce ne sont que des propositions génériques.
Version 1 (valeurs absolues)
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 (valeurs relatives)
Dans cet exemple, les x
-values et y
-values sont ajoutées.
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
Production

Question principale et remarques
- Question: Ce type de diagramme a-t-il un nom?
- Question principale: quelle serait une manière intelligente d'y parvenir?
- Remarque: je préférerais utiliser
pgfplots
. - Remarque: je ne suis pas marié à un format d'entrée spécifique - je génère moi-même les données (Matlab, Python, Excel) et je peux donc les influencer.
Réponses
Voici une option très basique. Utilisez pgfplotstable
et plain Ti k Z pour convertir les données dans un graphique. Comme il est très basique, il peut être facile à personnaliser. Le prix que vous devez payer est que vous devez réparer certaines choses à la main
x=3mm,y=3mm,declare function={nrows=3;}
qui définit les unités et le nombre de lignes. (En toute honnêteté, également dans certains pgfplots
scénarios, vous devez définir explicitement le nombre de lignes ou de colonnes.)
\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}

On peut en fait intégrer cela dans pgfplots
. Il y a un petit problème concernant l'extension, d'où la supercherie \edef
et \noexpand
(voir la discussion p. 545 du manuel pgfplots 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}
