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}