我想用 pgfplots 制作一个直方图,在 y 轴上显示百分比而不是落入箱中的点数,如下所示(示例取自手册):
\documentclass[11pt]{scrartcl}
\usepackage{tikz}
\usepackage{pgfplots}
\usepgfplotslibrary{statistics}
\usepackage{filecontents}
\begin{filecontents*}{histdata.dat}
1
2
1
5
4
10
7
10
9
8
9
9
\end{filecontents*}
\begin{document}
\begin{tikzpicture}[]
\begin{axis}[
ybar interval,
xticklabel={\pgfmathprintnumber\tick--\pgfmathprintnumber\nexttick},
yticklabel={\pgfmathparse{(\tick/12)*100}\pgfmathprintnumber{\pgfmathresult}\%},
yticklabel style={
/pgf/number format/.cd,
fixed, precision=0,
/tikz/.cd
},
]
\addplot+ [hist={bins=3}]
table [y index=0] {histdata.dat};
\end{axis}
\end{tikzpicture}
\end{document}
但是,只有知道数据值总数(在本例中为 12)才可以计算百分比。
在 pgfplots 或 (lua)latex 中是否有一种方法可以计算数据值的数量,即数据文件中的行数?
答案1
pgfplotstable
有一个宏:
\pgfplotstablegetrowsof{histdata.dat}
\edef\NRows{\pgfplotsretval} % save result to \NRows
完整示例:
\documentclass[11pt]{scrartcl}
\usepackage{pgfplotstable} % loads pgfplots which loads tikz
\usepgfplotslibrary{statistics}
\usepackage{filecontents}
\begin{filecontents*}{histdata.dat}
1
2
1
5
4
10
7
10
9
8
9
9
\end{filecontents*}
\pgfplotstablegetrowsof{histdata.dat}
\edef\NRows{\pgfplotsretval}
\begin{document}
\begin{tikzpicture}[]
\begin{axis}[
ybar interval,
xticklabel={\pgfmathprintnumber\tick--\pgfmathprintnumber\nexttick},
yticklabel={\pgfmathparse{(\tick/\NRows)*100}\pgfmathprintnumber{\pgfmathresult}\%},
yticklabel style={
/pgf/number format/.cd,
fixed, precision=0,
/tikz/.cd
},
]
\addplot+ [hist={bins=3}]
table [y index=0] {histdata.dat};
\end{axis}
\end{tikzpicture}
\end{document}