使用 coordindex 生成的 xtick 标签出现错误

使用 coordindex 生成的 xtick 标签出现错误

我有一个 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

错误的 xtick 标签

有趣的是,xlabels 处于正确的位置,但 latex 并没有真正运行x expr=\coordindex命令。它总是从上到下读取 CSV 文件,直到数量xticklabels等于xticklabels我定义的数量,但它忽略了索引。

我使用了相同的代码,针对不同的 CSV 文件使用不同的步骤,一切都很好,上面的代码和我使用的 CSV 文件之间的唯一区别是,其他 CSV 文件要大得多,步骤也更大,但仅此而已。我也尝试定义xminxmax,但也没有帮助。

我非常感谢您的帮助。

答案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 行。上述代码的输出如下:

示例输出

相关内容