我想使用 pgfplots 绘制散点图,并希望数据在绘图区域中的显示方式与表格中列出的相同。我不希望对数据进行排序然后进行绘制。
如图所示,最左边要绘制的数据应该是(x=7,y=10),降序排列是(6,2),但现在最左边绘制的数据是(1,5),这意味着它是自动排序的。
%pdflatex
\documentclass[standalone]{book}
\usepackage{tikz,pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
scatter/classes={%
a={mark=o,draw=black}}]
\addplot[scatter,only marks,scatter src=explicit symbolic]%
table[meta=label] {
x y label
7 10 a
10 8 a
8 7 a
4 6 a
9 5 a
1 5 a
5 4 a
3 4 a
2 3 a
6 2 a
};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
PGFplots 的默认行为是使用 x 坐标作为... 坐标。因此,自然而然地,x 值最低的点将出现在左侧。您想要实现的是使用列x
作为符号刻度标签而不是坐标,另外使用行号作为图的正确 x 坐标。后者可以通过 实现x expr=\coordindex
。这将删除您所谓的“排序”,并按表格中出现的顺序显示 y 坐标,x=0、x=1 等位置...
使用该x
列作为符号刻度标签有点棘手。Jake 的这个回答演示如何通过定义一个新键来实现这一点xticklabels from table
,该键必须在axis
环境中使用。此外,必须将数据表提供给键和addplot 命令,因为刻度标签属于axis
,它可以包含多个图,但只能包含一组刻度。此外,您必须指定xtick=data
为表中的每个数据点获取一个刻度。
完整示例如下:
\documentclass[standalone]{book}
\usepackage{tikz,pgfplots,pgfplotstable}
\pgfplotstableread{
x y label
7 10 a
10 8 a
8 7 a
4 6 a
9 5 a
1 5 a
5 4 a
3 4 a
2 3 a
6 2 a
}{\MyData}
\makeatletter
\pgfplotsset{
/pgfplots/xticklabels from table/.code 2 args={%
\pgfplotstablegetcolumn{#2}\of{#1}\to\pgfplots@xticklabels
\let\pgfplots@xticklabel=\pgfplots@user@ticklabel@list@x
}
}
\makeatother
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
scatter/classes={%
a={mark=o,draw=black}},
xtick=data,
xticklabels from table={\MyData}{x}
]
\addplot[scatter,only marks,scatter src=explicit symbolic]%
table[meta=label, x expr=\coordindex, ] {\MyData};
\end{axis}
\end{tikzpicture}
\end{document}