PGFPLOTS 坐标过滤作为一种风格?

PGFPLOTS 坐标过滤作为一种风格?

我正在使用 pgfplots 为我的论文绘制图表,我有许多散点图,我希望它们具有一致的格式。我用两列(来自通过 加载的外部文件\pgfplotstableread)控制散点图标记的形状和颜色,这两列在许多输入文件中具有一致的名称。

到目前为止,我的解决方案是使用一个来定义scatter/classes,使用另一个来过滤。这种方法效果很好,但我希望将过滤参数指定为样式,而不需要在每个\addplot命令上重复过滤代码。

正在起作用的是:

\documentclass{article}               

\usepackage{pgfplots,pgfplotstable,tikz}
\usepackage{filecontents}

\begin{filecontents}{data.dat}
x y color shape
1 3 a 0
2 6 b 0
3 5 a 1
4 4 b 1
5 9 a 0
6 1 b 1
\end{filecontents}
\begin{document}

\pgfplotstableread{data.dat}\datafile

\begin{tikzpicture}
\begin{axis}
\addplot[x filter/.code={
\pgfplotstablegetelem{\coordindex}{shape}\of{\datafile}
    \ifnum\pgfplotsretval=0
    \else
    \def\pgfmathresult{}
    \fi},only marks, scatter, scatter src=explicit symbolic,  scatter/classes={
a={blue},%
b={red}%
},mark=o] table[x=x,y=y, meta=color] {\datafile};
\addplot[x filter/.code={
\pgfplotstablegetelem{\coordindex}{shape}\of{\datafile}
    \ifnum\pgfplotsretval=1
    \else
    \def\pgfmathresult{}
    \fi},only marks, scatter, scatter src=explicit symbolic, scatter/classes={
a={blue},%
b={red}%
},mark=square] table[x=x,y=y, meta=color] {\datafile};
\end{axis}
\end{tikzpicture}

\end{document}

我不能直接将x filter代码插入样式中,因为它使用了表的名称(会发生变化)。我试过如果不是则丢弃风格,但它不适用于\pgfplotstableread

我可以将过滤代码放入样式中并进行修改以便它自动获取正确的表格(用于图中的所有其他内容)吗?

我知道我可以以不同的方式解决整个问题,即\pgfplotstableset在表中创建一个新列,该新列(以某种方式)连接颜色和形状,然后得到(示例中为 2x2)4 个不同的散点类。

答案1

在表名感知解决方案出现之前,您可以创建自己的风格来减少重复。

\documentclass{article}               

\usepackage{pgfplots,pgfplotstable}
\pgfplotsset{compat=1.7}
\usepackage{filecontents}

\begin{filecontents}{data.dat}
x y color shape
1 3 a 0
2 6 b 0
3 5 a 1
4 4 b 1
5 9 a 0
6 1 b 1
\end{filecontents}


\pgfplotstableread{data.dat}\datafile

\pgfplotsset{
mystyle/.style 2 args={
    x filter/.code={%
        \pgfplotstablegetelem{\coordindex}{shape}\of#1
        \ifnum\pgfplotsretval=#2\relax
        \else
        \def\pgfmathresult{}%
        \fi
    },
    only marks, scatter, scatter src=explicit symbolic,
    scatter/classes={
        a={blue},%
        b={red}%
        }
    }
}

\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot[mystyle={\datafile}{1},mark=o] table[x=x,y=y, meta=color] {\datafile};
\addplot[mystyle={\datafile}{0},mark=square] table[x=x,y=y, meta=color] {\datafile};
\end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

作为一个丑陋的黑客,您可以定义一个包含整个函数的新函数,\addplot....您可以在两个地方更改表名。

相关内容