当从文件中过滤数据(例如skip coords between index
)并从同一文件加载 x 个刻度标签时,不会跳过 x 个刻度标签,从而导致错误的标签。
举例来说,请考虑下面显示的代码。在文件中,我们有 3 行数据,名称为A
和B
。我们删除包含键C
的行。但是,生成的图仍然显示标签,但是 y 值为。B
skip coords
B
C
有办法解决这个问题吗?
\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}