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}
