pgfplots:绘制“拼凑”图的最佳方法

pgfplots:绘制“拼凑”图的最佳方法

更新/备注

在聊天中得到提示后,我也问了这个问题这里(在外面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 和-values。y

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),因此可以影响它。

答案1

这是一个非常基本的选项。使用pgfplotstable和普通的 TiZ 将数据转换为图表。由于它非常基础,因此可能很容易定制。你必须付出的代价是你需要手动修复一些事情

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技巧(请参阅 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}

在此处输入图片描述

相关内容