pgfplots 输入表达式解析错误

pgfplots 输入表达式解析错误

大家好,我手头有以下问题。我从外部 .csv 文件自动加载绘图数据,并通过一个简单的表达式(从毫秒转换为秒)对其进行操作,然后通过 pgfplots 进行绘图。每当我要绘制空值时,我的问题就会出现,表达式返回

软件包 PGF 数学错误:无法将输入 '' 解析为浮点数,抱歉。不可读部分位于 '' 附近。(在 '/1000' 中)。

为了更好地理解 MWE

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}
\usepackage{filecontents}

\begin{filecontents}{testdata.csv}
a;b;c
5000;;2000
\end{filecontents}

\begin{document}

\begin{tikzpicture}
  \begin{axis}[   
    legend entries = {
      \textbf{a},
      \textbf{b},
      \textbf{c},
    }
  ]  
  \addplot table[x expr=\coordindex,y expr=\thisrow{a}/1000, col sep=semicolon]{testdata.csv};
  \addplot table[x expr=\coordindex,y expr=\thisrow{b}/1000, col sep=semicolon]{testdata.csv};
  \addplot table[x expr=\coordindex,y expr=\thisrow{c}/1000, col sep=semicolon]{testdata.csv};

  \end{axis}
\end{tikzpicture}

\end{document}

在此示例中,b 列具有空值,这导致表达式出现错误。我的问题是,如何在不在空白处插入 NaN 的情况下解决该错误。

答案1

您可能考虑使用 ay filter而不是 a y expr,因为后者似乎无法处理缺失值。在进行计算之前,必须测试当前点是否缺失/为空。我在下面说明了这一点,如果您想以相同的方式转换轴上的所有图,这至少是可行的。

请注意,Harish Kumar 的一些建议,使用\pgfplotsset{compat=1.7}并将表格读入宏可能是一个好主意,而不是读取文件三次等。在这里,我只对您提供的 MWE 做了最小的更改。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}
\usepackage{filecontents}

\begin{filecontents}{testdata.csv}
a;b;c
5000;;2000
\end{filecontents}

\def\myemptymacro{}
\newcommand*{\divideathousand}[1]
        {\ifx\pgfmathresult\myemptymacro\else\pgfmathdivide{#1}{1000}\fi}

\begin{document}

\begin{tikzpicture}
  \begin{axis}[   
    legend entries = {
      \textbf{a},
      \textbf{b},
      \textbf{c},
    },
    y filter/.code={\divideathousand{#1}}
  ]
  \addplot table[x expr=\coordindex,y=a, col sep=semicolon]{testdata.csv};
  \addplot table[x expr=\coordindex,y=b, col sep=semicolon]{testdata.csv};
  \addplot table[x expr=\coordindex,y=c, col sep=semicolon]{testdata.csv};


  \end{axis}
\end{tikzpicture}

\end{document}

结果:

输出说明

但请注意,图例是不正确的,因为第二个图没有保留任何点......

答案2

我不明白你为什么要绘制空值。但是,如果你选择使用0而不是空值,这里会自动建议使用pgfplotstable。我们可以用替换空单元格,0并且0/1000不会产生NaN错误,因为结果是定义的(即0

代码:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}
\pgfplotsset{compat=1.7}
\usepackage{pgfplotstable}
\pgfplotstableset{col sep=semicolon}
\usepackage{filecontents}

\begin{filecontents*}{testdata.csv}
a;b;c
5000;;2000
\end{filecontents*}
\pgfplotstableread{testdata.csv}\loadedtable

\begin{document}

\begin{tikzpicture}
  \begin{axis}[
    legend entries = {
      \textbf{a},
      \textbf{b},
      \textbf{c},
    }
  ]
  \addplot table[x expr=\coordindex,y expr=\thisrow{a}/1000, col sep=semicolon]{\loadedtable};
  \addplot table[x expr=\coordindex,y expr=\thisrow{b}/1000, col sep=semicolon]{\loadedtable};
  \addplot table[x expr=\coordindex,y expr=\thisrow{c}/1000, col sep=semicolon]{\loadedtable};

  \end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容