如何停止 pgfplots 散点图对数据表进行排序?

如何停止 pgfplots 散点图对数据表进行排序?

我想使用 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}

相关内容