![如何创建相对频率直方图](https://linux22.com/image/393991/%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E7%9B%B8%E5%AF%B9%E9%A2%91%E7%8E%87%E7%9B%B4%E6%96%B9%E5%9B%BE.png)
我正在尝试创建一个标准化频率直方图。最小工作示例改编自这个TexStackExchange答案@Jake(见下面的代码)。我知道我可以将添加密度切换到 hist={},但这并不是我想要的。我想将特定间隔的频率除以总观察次数(这里是 10)。目标是始终有一个在 0 和 1 之间缩放的 y 轴。我得到
\documentclass[border=5mm]{standalone}
\usepackage{filecontents}
\usepackage{pgfplots, pgfplotstable}
\usepgfplotslibrary{statistics}
\begin{filecontents}{data.csv}
dist
0.00
0.15
0.15
0.25
0.25
0.25
0.40
0.40
0.40
0.40
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ybar,
ymin=0,
ymax=4
]
\addplot +[
hist={
density,
bins=4,
data min=0.0,
data max=0.4
}
] table [y index=0] {data.csv};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
这是该问题的重复:pgfplots 中的直方图:计算数据值的总数由@Torbjørn T 回答。
他的解决方案使用包\pgfplotstablegetrowsof
中的宏pgfplotstable
来确定数据文件中的行数。\pgfplotstablegetrowsof
然后将 的值赋给\NRows
。
\NRows
然后通过将刻度的值除以的值来生成 x 轴值yticklabel={\pgfmathparse{(\tick/\NRows)*100}\pgfmathprintnumber{\pgfmathresult}\%}
。
在他的回答中,Torbjørn 还将 x 轴标签作为间隔生成,这也适用于此处。
这是 MWE:
\documentclass[border=5mm]{standalone}
\usepackage{filecontents}
\usepackage{pgfplots, pgfplotstable}
\usepgfplotslibrary{statistics}
\begin{filecontents}{data.csv}
dist
0.00
0.15
0.15
0.25
0.25
0.25
0.40
0.40
0.40
0.40
\end{filecontents}
% Get the number of rows
\pgfplotstablegetrowsof{data.csv}
\pgfmathsetmacro\NRows{\pgfplotsretval}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ybar interval,
ymin=0,
ymax=4,
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={
density,
bins=4,
data min=0.0,
data max=0.4
}
] table [y index=0] {data.csv};
\end{axis}
\end{tikzpicture}
\end{document}
这是输出:
答案2
一种可能性是定义ytick
并ticklabels
手动:
\documentclass[border=5mm]{standalone}
\usepackage{filecontents}
\usepackage{pgfplots, pgfplotstable}
\usepgfplotslibrary{statistics}
\begin{filecontents}{data.csv}
dist
0.00
0.15
0.15
0.25
0.25
0.25
0.40
0.40
0.40
0.40
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ybar,
ymin=0,
ymax=4,
ytick={0,...,4}, % <---
yticklabels={0.0,0.1,0.2,0.3,0.4}, % <---
]
\addplot +[
hist={
density,
bins=4,
data min=0.0,
data max=0.4,
}
] table [y index=0] {data.csv};
\end{axis}
\end{tikzpicture}
\end{document}
附录:
关于 OP 评论,对于所讨论的特定情况,y 刻度标签可以根据\tick
s 计算如下:
\documentclass[border=5mm]{standalone}
\usepackage{filecontents}
\usepackage{pgfplots, pgfplotstable}
\usepgfplotslibrary{statistics}
\begin{filecontents}{data.csv}
dist
0.00
0.15
0.15
0.25
0.25
0.25
0.40
0.40
0.40
0.40
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ybar,
ymin=0,
ymax=4,
yticklabel={\pgfmathparse{\tick/10} % <---
\pgfmathprintnumber[fixed]{\pgfmathresult}% <---
},
]
\addplot +[
hist={
density,
bins=4,
data min=0.0,
data max=0.4,
}
] table [y index=0] {data.csv};
\end{axis}
\end{tikzpicture}
\end{document}
这使: