我有一个 CSV 文件,例如
time_ realval NN PF UKF
2:30:51 0.11408 0.11408 0.08777 0.08776
2:30:51 0.11408 0.11408 0.08777 0.08776
2:30:51 0.11408 0.11408 0.08777 0.08776
2:30:51 0.11408 0.11408 0.08776 0.08776
2:30:51 0.11408 0.11408 0.08776 0.08776
2:30:51 0.11408 0.11408 0.08776 0.08776
2:30:51 0.11408 0.11408 0.08776 0.08776
2:30:51 0.11408 0.11408 0.08775 0.08775
2:30:51 0.11408 0.11408 0.08775 0.08775
2:30:51 0.11408 0.11408 0.08775 0.08775
2:30:52 0.11408 0.11408 0.08775 0.08775
2:30:52 0.11408 0.11408 0.08775 0.08775
2:30:52 0.11408 0.11408 0.08774 0.08775
2:30:52 0.11408 0.11408 0.08774 0.08775
2:30:52 0.11408 0.11408 0.08774 0.08774
我正在尝试绘制图中每列的值,但我不想绘制所有xticks
标签,因为它不可读,所以我使用了以下代码:
\documentclass[journal]{IEEEtran}
\usepackage{pgfplotstable}
\usepackage{subfig}
\usepackage{tikz,pgfplots}
\begin{document}
\begin{figure*}[ht]
\subfloat
{\pgfplotstableread[col sep=comma]{all_methods_compare3.csv}\data
\begin{tikzpicture}
\begin{axis}[
xtick=data,
xtick={1,100,...,800},
xticklabel style={rotate=90,anchor=east},
xticklabels from table=\data{time_},
]
\addplot table [x expr=\coordindex, y=NN , col sep=comma] {all_methods_compare3.csv};
\end{axis}
\end{tikzpicture}
}
\end{figure*}
\end{document}
所以我希望得到xticklabels
这样的结果1,100,200,...,800
,但我得到了如下图所示的结果xticklabels
:
有趣的是,xlabels 处于正确的位置,但 latex 并没有真正运行x expr=\coordindex
命令。它总是从上到下读取 CSV 文件,直到数量xticklabels
等于xticklabels
我定义的数量,但它忽略了索引。
我使用了相同的代码,针对不同的 CSV 文件使用不同的步骤,一切都很好,上面的代码和我使用的 CSV 文件之间的唯一区别是,其他 CSV 文件要大得多,步骤也更大,但仅此而已。我也尝试定义xmin
和xmax
,但也没有帮助。
我非常感谢您的帮助。
答案1
使用 时xticklabels from table
,您将获得表格的前 N 行,它不会查找与 对应的表格行\coordindex
。我认为这没有意义,刻度规范与绘制的值是分开的。
您或许可以使用以下技术,使用xticklabel
,并从表中手动读取刻度标签。查看代码中的注释,如果有任何不清楚的地方请询问。
(我删除了,col sep=comma
因为您显示的文件没有使用逗号分隔列。)
\documentclass[journal]{IEEEtran}
\usepackage{pgfplotstable} % loads pgfplots, which loads tikz
\usepackage{subfig}
\begin{document}
\begin{figure*}[ht]
\subfloat
{\pgfplotstableread{data.dat}\data
\begin{tikzpicture}
\begin{axis}[
xtick={0,100,...,800}, % start at 0, because \coordindex starts at zero
xticklabel style={rotate=45,anchor=north east},
xticklabel={%
% \tick gives the tick value with decimals, use int to make it an integer
% result of \pgfmathparse is saved in \pgfmathresult
\pgfmathparse{int(\tick)}%
% then read the value from the time_ column with the row number
% given by \pgfmathresult
\pgfplotstablegetelem{\pgfmathresult}{t}\of\data%
% the value is saved to \pgfplotsretval, so issue that macro to print the ticklabel
\pgfplotsretval
},
]
\addplot [] table [x expr=\coordindex, y=NN] {\data};
\end{axis}
\end{tikzpicture}
}
\end{figure*}
\end{document}
为了证明该方法有效,我生成了一个包含 801 行的数据文件,其中的时间值与您显示的值类似(我的情况是每秒五个值),y 值为随机数。需要 801 行,因为pgfplotstable
从零开始计数,因此对于最后一个刻度,\pgfplotstablegetelem
查找第 801 行。上述代码的输出如下: