我正在尝试从一个 pgfplotstable 创建多个图(\data
见下文)。我可以通过手动编辑数据(\dataA
见\dataB
下文)来创建图,但这很容易出错。本质上,我需要帮助:
- 分割基于列的表格
cat
- 复制最后一行(除上一行外
xmin
)xmax
- 创建一个循环创建多个
tikzpicture
s [我大概可以自己弄清楚!]
\documentclass{article}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.15}
\begin{document}
\pgfplotstableread{
x xmin xmax par1 y cat par2
0.5 0 1 yes 0.3 1 no
1.5 1 2 yes 0.6 1 no
2.5 2 3 yes 0.7 1 no
0.5 0 1 yes 0.4 2 no
1.5 1 2 yes 0.5 2 no
2.5 2 3 yes 0.9 2 no
}\data
\pgfplotstableread{
x xmin xmax par1 y cat par2
0.5 0 1 yes 0.3 1 no
1.5 1 2 yes 0.6 1 no
2.5 2 3 yes 0.7 1 no
2.5 3 3 yes 0.7 1 no
}\dataA
\pgfplotstableread{
x xmin xmax par1 y cat par2
0.5 0 1 yes 0.4 2 no
1.5 1 2 yes 0.5 2 no
2.5 2 3 yes 0.9 2 no
2.5 3 3 yes 0.9 2 no
}\dataB
\begin{tikzpicture}
\begin{axis}[ybar, ymin=0, ymax=1, xmin=-0.5, xmax=3.5]
\addplot[black, ybar interval] table[x=xmin,y=y] {\dataA}\closedcycle;
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}[ybar, ymin=0, ymax=1, xmin=-0.5, xmax=3.5]
\addplot[black, ybar interval] table[x=xmin,y=y] {\dataB}\closedcycle;
\end{axis}
\end{tikzpicture}
\end{document}
关于分割数据,我已经能够打印分区表,但是我该如何使用它作为输入\addplot
?
\newcommand{\filtertable}[2]{
\pgfplotstabletypeset[
columns/par1/.style={string type},
columns/par2/.style={string type},
row predicate/.code={%
\pgfplotstablegetelem{##1}{cat}\of{#1}
\ifnum\pgfplotsretval=#2\relax
\else\pgfplotstableuserowfalse\fi}
]{#1}
}
\filtertable{\data}{1}
\filtertable{\data}{2}
关于复制最后一行,最后几行中唯一相关的值是xmin
。根据 PGF 手册ybar interval
“最后一个 y 值将被忽略。”我尝试创建相同的图,但没有成功,但没有添加额外的行。请注意xmin
和之间的距离xmax
不能总是等于 1。
答案1
一种方法是安装一个过滤器,例如
无界坐标=丢弃,x 过滤器/.表达式={\thisrow{cat}==1 ? x : nan}
梅威瑟:
\documentclass{article}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.15}
\begin{document}
\pgfplotstableread{
x xmin xmax par1 y cat par2
0.5 0 1 yes 0.3 1 no
1.5 1 2 yes 0.6 1 no
2.5 2 3 yes 0.7 1 no
0.5 0 1 yes 0.4 2 no
1.5 1 2 yes 0.5 2 no
2.5 2 3 yes 0.9 2 no
}\data
\pgfplotstableread{
x xmin xmax par1 y cat par2
0.5 0 1 yes 0.3 1 no
1.5 1 2 yes 0.6 1 no
2.5 2 3 yes 0.7 1 no
2.5 3 3 yes 0.7 1 no
}\dataA
\pgfplotstableread{
x xmin xmax par1 y cat par2
0.5 0 1 yes 0.4 2 no
1.5 1 2 yes 0.5 2 no
2.5 2 3 yes 0.9 2 no
2.5 3 3 yes 0.9 2 no
}\dataB
\begin{tikzpicture}
\begin{axis}[ybar, ymin=0, ymax=1, xmin=-0.5, xmax=3.5]
\addplot[black, ybar interval,unbounded coords=discard,
x filter/.expression={\thisrow{cat}==1 ? x : nan}] table[x=xmin,y=y] {\data}\closedcycle;
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}[ybar, ymin=0, ymax=1, xmin=-0.5, xmax=3.5]
\addplot[black, ybar interval,unbounded coords=discard,
x filter/.expression={\thisrow{cat}==2 ? x : nan}] table[x=xmin,y=y] {\data}\closedcycle;
\end{axis}
\end{tikzpicture}
\end{document}