pgfplots:「パッチワーク」図を描くための最良の方法
Nov 22 2020
更新/備考
チャットでヒントを得た後、ここでも質問しました(https://tex.stackexchange.com/)そして別のアプローチを得ました。
- これは、この質問のフォローアップ質問です。
- 手描きのように図を描きたいです。
- アイデアはでテーブルを提供することであり
x
、y
、color
および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}
