我有以下输入文件(sample.txt):
A 1 2
B 23 2
C 2 34
D 12 22
E 23 3
F 34 12
我想创建一个散点图,其中第二列是 x 轴,第三列是 y 轴,第一列是每个点的标签。
然而,我想仅有的列表 L = [B,D,E] 中存在的标签点
该列表应该在源代码中定义(即不在文件中),可以更改,并且应反映在图中。
我在 PGF 图上很难完成此操作。有什么想法吗?
这是我迄今为止的尝试
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot+ [mark = x,
only marks,
visualization depends on={value \thisrowno{0}}
] table[x index = 1, y index = 2] {annot_no_align.out};
\end{axis}
\end{tikzpicture}
\end{document}
注意:您可能已经知道,我是 PGFPlots 的初学者。
答案1
node near coords
因此,这是和一些练习的结合if
。
\pgfutil@in@
可以在 中找到 的定义pgfutil-common.tex
。也可以查阅 LaTeX\includeonly
和 BEAMER 的\includeonlyframes
。
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}
\begin{document}
\makeatletter
\def\labelonly{BDF}
\def\labelcheck#1{
\edef\pgfmarshal{\noexpand\pgfutil@in@{#1}{\labelonly}}
\pgfmarshal
\ifpgfutil@in@[#1]\fi
}
\makeatother
\begin{tikzpicture}
\begin{axis}
\addplot[
mark=*,
only marks,
point meta=explicit symbolic,
nodes near coords={
\labelcheck{\pgfplotspointmeta}
}
]
table[header=false,meta index=0,x index=1,y index=2]{
A 1 2
B 23 2
C 2 34
D 12 22
E 23 3
F 34 12
};
\end{axis}
\end{tikzpicture}
\makeatletter
\end{document}
更新
如果您更喜欢 CSV,这里有一个更好的解决方案。我正在使用本机\pgfkeys
功能,因此您可能已经知道什么是危险的,什么不是。(例如逗号是危险的。)
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}
\begin{document}
\pgfkeys{
/prepare label/.style={
/print label/\detokenize{#1}/.code={\ttfamily\detokenize{#1}}
},
/prepare label/.list={^_^,@_@,T_T}
}
\begin{tikzpicture}
\begin{axis}
\addplot[
mark=*,
only marks,
point meta=explicit symbolic,
nodes near coords={
\pgfkeys{/print label/\pgfplotspointmeta/.try}
}
]
table[header=false,meta index=0,x index=1,y index=2]{
^_^ 1 2
>_< 23 2
@_@ 2 34
Q_Q 23 3
T_T 12 22
=_= 34 12
};
\end{axis}
\end{tikzpicture}
\end{document}