针对这个问题(pgfplots(table) 电子表格类似公式) 我收到的评论说可以使用包 datatool 来完成。但实际上我在将数据从 datatool 传递到 pgfplots 时遇到了问题。
像这样的事情:
\documentclass[border=3pt]{standalone}
\usepackage{datatool}
\usepackage{pgfplots}
\catcode`\^^I=12 %
\DTLsetseparator{ }%
\pgfplotsset{compat=1.12}
\DTLloaddb{coordinates}{data.csv}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ytick={5,6,7},
xtick=data
]
\DTLforeach*{coordinates}{\x=x,\y=y}{%
\ifnum\value{DTLrowi}>1
\addplot coordinates {(\mtx,\mty) (\x,\y)};
\fi
\xdef\mtx{\x}\xdef\mty{\y}
}
\end{axis}
\end{tikzpicture}
\end{document}
无法正常工作,因为我总是为一条曲线获取两个点,然后绘制一条新的完全独立的曲线。这在逻辑上绝对不是我想要做的。我的目标是从文件中读取数据,使用 datatool 处理它,然后使用 pgfplots 绘制它们(是的,我知道有 datatoolplot,但 pgfplots 更灵活)。
此外,使用 if 循环将数据插入 pgfplots 对我来说似乎非常冗长。
有人能想到一个更好更简单的方法来实现这一点吗(特别是将所有数据传递到一个图中,而不是像文件中那样多的行(减一))?
编辑:数据文件可能看起来像这样(制表符分隔):
x y
1 2
2 4
3 2
4 0
答案1
您可以忘记每个图,这样下一行将具有与第一行相同的样式。如果您想添加图例,那么您应该使用 为其提供单独的条目\addlegendimage
,因为所有先前的图都被遗忘了,所以没有什么可以添加图例条目。但事实上它不是很有效,所以如果您能够在其中进行必要的数据操作,pgfplots
那么建议这样做。还请注意+
,\addplot+
需要将自动格式化(颜色、标记)应用于forget plot
图。我在输入文件中用逗号替换了制表符,以简化代码。
梅威瑟:
\documentclass{article}
\usepackage{datatool}
\usepackage{pgfplots}
\DTLloaddb{coordinates}{data.csv}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ytick={0,...,4},
xtick=data
]
\DTLforeach*{coordinates}{\x=x,\y=y}{%
\ifnum\value{DTLrowi}>1
\addplot+[forget plot] coordinates {(\mtx,\mty) (\x,\y)};
\fi
\xdef\mtx{\x}\xdef\mty{\y}
}
\addlegendimage{line legend,blue,mark=*}
\addlegendentry{x-y plot}
\end{axis}
\end{tikzpicture}
\end{document}
结果:
编辑:为了避免\addplot
对每个坐标单独进行操作,您可以先将坐标列表存储在循环中,然后使用单个绘图命令。这是简化版的使用下一行的值迭代整个表。输出是一样的。
\documentclass{article}
\usepackage{datatool}
\usepackage{pgfplots}
\DTLloaddb{coordinates}{data.csv}
\begin{document}
% adapted from https://tex.stackexchange.com/questions/266332/iterating-through-a-table-using-values-on-the-next-row
\def\mtplot{}
\DTLforeach*{coordinates}{\x=x,\y=y}{%
\edef\mtplot{\mtplot(\x,\y)}%
}
\begin{tikzpicture}
\begin{axis}[
ytick={0,...,4},
xtick=data
]
\addplot coordinates {\mtplot};
\addlegendentry{single plot}
\end{axis}
\end{tikzpicture}
\end{document}