如何使用文件中的数据生成散点图并使用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}