pgfplots:在由表生成的散点图中使用循环列表?

pgfplots:在由表生成的散点图中使用循环列表?

如何使用文件中的数据生成散点图并使用cycle list name选项为文件中的每个条目分配不同的符号?

似乎手册只解释了如果我通过命令手动添加文件的每个条目,该如何操作。就我而言,使用命令导入数据\addplot coordinates要方便得多。\addplot table

这是MWE:

\documentclass{standalone}

\usepackage{tikz}
\usepackage{pgfplots}

\pgfplotsset{compat=newest}

\begin{document}
\begin{tikzpicture}

\begin{axis}[cycle list name=mark list*]
  \addplot[only marks] table[x=x,y=y] {mwe.dat};
\end{axis}

\end{tikzpicture}
\end{document}

数据文件为:

x y
1.0 2.0
2.0 1.0

输出为:

在此处输入图片描述

然而,我想要得到的是(注意 的符号(2.0,1.0)是一个正方形):

在此处输入图片描述

如果我将环境替换axis

\begin{axis}[cycle list name=mark list*]
  \addplot coordinates {(1.0,2.0)};
  \addplot coordinates {(2.0,1.0)};
\end{axis}

答案1

正如您自己所说,您需要有单独的图来更改标记。因此,您可以循环遍历表的所有条目,并通过安装适当的过滤器绘制每个坐标,

x filter/.code={\unless\ifnum\coordindex=#1
  \def\pgfmathresult{}
  \fi}

可以找出数据有多少行,

\pgfplotstableread{mwe.dat}{\Data}
\pgfplotstablegetrowsof{\Data}
\pgfmathtruncatemacro{\numrows}{\pgfplotsretval-1}

确定循环的长度。

\documentclass{standalone}
\begin{filecontents*}{mwe.dat}
x y
1.0 2.0
2.0 1.0
\end{filecontents*}

\usepackage{pgfplots}

\pgfplotsset{compat=newest}

\begin{document}
\begin{tikzpicture}
\pgfplotstableread{mwe.dat}{\Data}
\pgfplotstablegetrowsof{\Data}
\pgfmathtruncatemacro{\numrows}{\pgfplotsretval-1}
\begin{axis}[cycle list name=mark list*]
  \pgfplotsinvokeforeach{0,...,\numrows}
  {\addplot+[only marks,
  x filter/.code={\unless\ifnum\coordindex=#1
  \def\pgfmathresult{}
  \fi}] table[x=x,y=y] {mwe.dat};}
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

实现相同结果的可能更简单的方法是使用scatter/@pre marker code。您可以将标记存储在自己的循环列表中。

\documentclass{standalone}
\begin{filecontents*}{mwe.dat}
x y
1.0 2.0
2.0 1.0
3.0 0.5
4.0 1.5
5.0 2.5
\end{filecontents*}

\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{document}
\begin{tikzpicture}
\def\mymarklist{"*","square*","triangle*","diamond*"}
\begin{axis}[
      scatter/@pre marker code/.code={
      \pgfmathsetmacro{\mymark}{{\mymarklist}[Mod(\coordindex,dim(\mymarklist))]}
      \def\markopts{mark=\mymark}
      \expandafter\scope\expandafter[\markopts]
      },
      scatter/@post marker code/.code={
      \endscope
      }]
  \addplot[scatter,only marks] table[x=x,y=y] {mwe.dat};
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容