我正在使用 tikzpicture 进行绘图。我想要绘制的值是典型的 (X,Y) 对。x 值是一个无趣的 id 值。我想根据 y 值按升序/降序排列容器,但我该怎么做呢?该图似乎会自动采用 x 值进行排序,我该如何覆盖它?(我并不是特别喜欢 tikzpicture - 它只是第一个真正起作用并显示绘图的东西......)按照最简示例,我如何根据 y 值实现重新排序?
\documentclass{article}
\usepackage[english]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{relsize}
\usepackage{times}
\usepackage{url}
\usepackage{latexsym}
\usepackage{graphicx}
\usepackage{colortbl}
\usepackage{color}
\usepackage{caption}
\usepackage{pgfplots, pgfplotstable}
\usetikzlibrary{arrows}
\usepackage{amsmath}
\usepackage{multirow}
\usepackage{booktabs}
\usepackage{filecontents}
\definecolor{OgAns}{rgb}{0, 0.8, 0.4}
\begin{filecontents}{testdata.dat}
1 30
2 44
4 26
3 39
\end{filecontents}
\begin{document}
\begin{figure}
\begin{tikzpicture}
\begin{axis}[
ybar stacked,
ymin=0,
ymax=100,
bar width=5pt,
legend style={at={(0.35, -0.4)},anchor=south west},
legend columns=-1
]
\addplot[ybar,fill=OgAns] file {testdata.dat};
\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}
答案1
您可以使用包对表格进行排序pgfplotstable
。它提供了一个命令\pgfplotstablesort[<options>]{<output table name>}{<input table>}
。要读取testdata.dat
文件并根据第二列按降序排序,将排序后的表格存储在名为的宏中\datatablesorted
,您可以使用以下命令:
\pgfplotstablesort[sort key=1, sort cmp=int >]{\datatablesorted}{testdata.dat}
要绘制排序表,您可以使用以下命令:
\addplot [fill=green] table [x expr=\coordindex] {\datatablesorted};
必须x expr=\coordindex
确保条形图按照它们在排序表中出现的顺序绘制,否则它们将根据第一列中的值绘制。
为了获得条形的正确标签,请xticklabels from table={\datatablesorted}{0}
在axis
选项中包含指示 PGFPlots 从表格的第一列中获取标签\datatablesorted
。
\documentclass{article}
\usepackage{pgfplots, pgfplotstable}
\usepackage{filecontents}
\begin{filecontents}{testdata.dat}
1 30
2 44
4 26
3 39
\end{filecontents}
\pgfplotstablesort[sort key=1, sort cmp=int >]{\datatablesorted}{testdata.dat}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ybar,
ymin=0,
ymax=100,
xtick=data,
xticklabels from table={\datatablesorted}{0}
]
\addplot [fill=green] table [x expr=\coordindex] {\datatablesorted};
\end{axis}
\end{tikzpicture}
\end{document}