使用 datatool 处理输入并将其进一步传递给 pgfplots 来绘制数据

使用 datatool 处理输入并将其进一步传递给 pgfplots 来绘制数据

针对这个问题(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}

相关内容