“skip coords” 和 “xticklabels from file” 导致标签错误

“skip coords” 和 “xticklabels from file” 导致标签错误

当从文件中过滤数据(例如skip coords between index)并从同一文件加载 x 个刻度标签时,不会跳过 x 个刻度标签,从而导致错误的标签。

举例来说,请考虑下面显示的代码。在文件中,我们有 3 行数据,名称为AB。我们删除包含键C的行。但是,生成的图仍然显示标签,但是 y 值为。Bskip coordsBC

有办法解决这个问题吗?

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{filecontents}

\begin{document}
\begin{filecontents}{testdata.dat}
        id name val
        1 A 1
        2 B 2
        3 C 3
\end{filecontents}

\pgfplotstableread{testdata.dat}\data

\begin{tikzpicture}
    \begin{axis}[
        ybar,
        xtick=data,
        ymin=0,
        skip coords between index={1}{2}, % remove second row ("B")
        x filter/.append code={ % equivalent to the skip coords code, with same problem
            \pgfplotstablegetelem{\coordindex}{id}\of{\data}
            \ifnum\pgfplotsretval=2
                \def\pgfmathresult{}
            \else
            \fi
        },
        xticklabels from table={\data}{name}, % xticklabels still contain "B"
    ]
        \addplot table[x=id, y=val] {\data};

    \end{axis}
\end{tikzpicture}
\end{document}

错误版本:

图片

正确版本:

图片

答案1

我找到了一种更正标签的方法。这个想法是将包含名称的列存储在列表中,然后使用刻度号对列表进行索引以打印正确的标签。

代码生成了上面显示的正确版本。

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{filecontents}

\begin{document}
\begin{filecontents}{testdata.dat}
        id name val
        1 A 1
        2 B 2
        3 C 3
\end{filecontents}

\pgfplotstableread{testdata.dat}\data
\pgfplotstablegetcolumn{name}\of\data\to\listnames % store column with names into \listnames

\begin{tikzpicture}
    \begin{axis}[
        ybar,
        xtick=data,
        skip coords between index={1}{2}, % remove second row ("B")
        % xticklabels from table={\data}{name}, % xticklabels still contain "B"
        xticklabel=\pgfmathparse{int(\tick-1)} % need to subtract 1 because \tick starts with zero
            \pgfplotslistselect\pgfmathresult\of\listnames\to\myname % fetch name from list
            \myname, % print name
    ]
        \addplot table[x=id, y=val] {\data};

    \end{axis}
\end{tikzpicture}
\end{document}

相关内容