pgfplots:「パッチワーク」図を描くための最良の方法

Nov 22 2020

更新/備考

チャットでヒントを得た後、ここでも質問しましたhttps://tex.stackexchange.com/)そして別のアプローチを得ました。


  • これは、この質問のフォローアップ質問です。
  • 手描きのように図を描きたいです。
  • アイデアはでテーブルを提供することでありxycolorおよびlabel各長方形について。

入力

入力は次のようになります。これらは単なる一般的な提案です。

バージョン1(絶対値)

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

バージョン1(相対値)

この例では、x-valuesとy-valuesが追加されています。

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

出力

主な質問と備考

  • 質問:このダイアグラムタイプには名前がありますか?
  • 主な質問:これを達成するための賢い方法は何でしょうか?
  • 備考:を使用したいと思いますpgfplots
  • 備考:私は特定の入力形式と結婚していません-私は自分でデータ(Matlab、Python、Excel)を生成するため、それに影響を与えることができます。

回答

3 Noname Nov 22 2020 at 04:50

これは非常に基本的なオプションです。使用pgfplotstableと普通のTi K Zはプロット内のデータを変換します。非常に基本的なため、簡単にカスタマイズできる場合があります。あなたが支払わなければならない賞はあなたが手でいくつかのことを修正する必要があるということです

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

単位と行数を設定します。(公平を期すために、一部のpgfplotsシナリオでは、行または列の数を明示的に設定する必要があります。)

\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}

実際にこれをに埋め込むことができpgfplotsます。拡張に関する小さな問題が故に、ある\edef\noexpand策略は(P上の説明を参照してください。pgfplotsマニュアルV1.17の545)。

\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}