如何创建相对频率直方图

如何创建相对频率直方图

我正在尝试创建一个标准化频率直方图。最小工作示例改编自这个TexStackExchange答案@Jake(见下面的代码)。我知道我可以将添加密度切换到 hist={},但这并不是我想要的。我想将特定间隔的频率除以总观察次数(这里是 10)。目标是始终有一个在 0 和 1 之间缩放的 y 轴。我得到

我得到了什么

但我想要(请注意 y 轴上史诗般的手绘零:D)。 我想要的是

\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

一种可能性是定义ytickticklabels 手动:

在此处输入图片描述

\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 刻度标签可以根据\ticks 计算如下:

\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}

这使:

在此处输入图片描述

相关内容