大家好,我手头有以下问题。我从外部 .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}