MATLAB 直方图



直方图是图形化地显示数值数据分布的图表。MATLAB 提供了一个方便的函数 `histogram` 来创建直方图,允许用户可视化数据集在不同区间或箱中的频率或概率分布。

语法

histogram(X)
histogram(X,nbins)
histogram(X,edges)
histogram('BinEdges',edges,'BinCounts',counts)
histogram(C)
histogram(C,Categories)
histogram('Categories',Categories,'BinCounts',counts)

语法的详细解释:

histogram(X) - `histogram(X)` 函数根据 X 中的数据生成直方图。此函数采用自动分箱方法,生成宽度相等的箱,旨在涵盖 X 中的值范围并揭示固有的分布模式。输出显示为矩形条,每个条的高度表示落入相应箱中的元素数量。

histogram(X,nbins) - `histogram(X, nbins)` 函数允许您定义直方图中要使用的箱的数量。

histogram(X,edges) - `histogram(X, edges)` 函数将 X 中的数据组织到由向量中指定的边缘确定的箱中。

histogram('BinEdges',edges,'BinCounts',counts) - `histogram('BinEdges', edges, 'BinCounts', counts)` 函数直接绘制提供的箱计数,无需对数据进行任何分箱。

histogram(C) - `histogram(C)` 函数生成一个直方图,显示分类数组 C 中每个类别的条形。

histogram(C,Categories) - `histogram(C, Categories)` 函数专门绘制分类数组 C 中选择的类别。

histogram('Categories',Categories,'BinCounts',counts) - `histogram('Categories', Categories, 'BinCounts', counts)` 函数允许手动指定类别及其各自的箱计数。然后,直方图绘制提供的箱计数,无需进行任何数据分箱。

直方图属性

直方图函数返回一个对象。

直方图的属性控制其外观和功能。更改这些属性值可以调整直方图的各个方面。使用点表示法访问特定的对象属性:

h = histogram(randn(10,1));
c = h.BinWidth;
h.BinWidth = 2;

直方图中的箱

在直方图中,箱代表数据被划分到的区间。这些区间涵盖数据的范围,并用于计算落在每个区间中的观测值的频率。本质上,箱定义了分隔不同数据值范围的边界,直方图中条形的高度对应于落入每个箱中的数据点的频率或计数。调整箱的数量或宽度会影响分布的可视化方式,可能揭示更多细节或平滑数据的表示。

箱的数量

箱的数量由正整数表示。当未指定 `NumBins` 时,直方图函数会根据提供的数据自动确定合适的箱数。如果您同时使用 `NumBins`、`BinMethod`、`BinWidth` 或 `BinEdges`,直方图函数只考虑最后一个参数。

箱的宽度

箱的宽度表示一个正标量值。当您定义 `BinWidth` 时,直方图最多可以使用 65,536 个箱(或 216)。如果指定的箱宽度需要更多箱,直方图会调整为更大的箱宽度,以适应最大箱数。对于日期时间和持续时间数据,`BinWidth` 可以是标量持续时间或日历持续时间。当您同时使用 `BinWidth`、`BinMethod`、`NumBins` 或 `BinEdges` 时,直方图函数只考虑最后一个参数。

示例 - `histogram(X,'BinWidth',5)` 使用宽度为 5 个单位的箱。

箱的边缘

箱的边缘由数值向量定义,其中第一个元素表示第一个箱的起始边缘,最后一个元素表示最后一个箱的结束边缘。最后一个边缘仅考虑最后一个箱。如果没有指定箱边缘,直方图函数会自动计算这些边缘。如果您同时使用 `BinEdges`、`BinMethod`、`BinWidth`、`NumBins` 或 `BinLimits`,直方图函数会优先考虑 `BinEdges`,并且它必须是提供的最后一个参数。

箱的限制

箱的限制由一个包含两个元素的向量 [bmin, bmax] 定义,其中第一个值表示第一个箱的起始边缘,第二个值表示最后一个箱的结束边缘。使用这些限制只计算包含在这些箱限制内的(包括边界)数据,表示为 X>=bmin & X<=bmax。

示例 - `histogram(X,'BinLimits',[1,10])` 只对介于 1 和 10 之间(包括边界)的值进行分箱。

直方图中的类别

在 MATLAB 中,当使用直方图函数处理分类数据时,“类别”指的是要可视化的分类数组中的不同组或标签。为分类数据创建直方图时,每个唯一类别将具有自己的条形,条形的高度表示该特定类别在数据集中出现的频率或计数。

包含在直方图中的类别

直方图中表示的类别由字符向量的元胞数组、分类数组、字符串数组或模式标量定义。

示例 - `h = histogram(C,{'Large','Small'})` 创建一个直方图,只显示与类别“Large”和“Small”关联的分类数据。

创建基本直方图

MATLAB 中的直方图函数生成直方图。这是一个简单的示例:

示例 1:创建基本直方图

这段代码根据从标准正态分布 (randn) 采样的 1000 个随机数生成直方图。直方图函数会根据数据自动确定合适的箱数。

% Generating sample data (1000 random numbers from a normal distribution)
data = randn(1000, 1);

% Creating a histogram
histogram(data);

在 MATLAB 命令窗口中执行相同的操作,输出结果为:

basic histogram

让我们来看另一个类似的例子,如下所示:

例2:使用直方图对象查找直方图区间

这段代码将根据5000个随机数生成一个直方图。直方图函数会自动选择最佳区间数来涵盖x中的值范围,有效地说明了分布的形式。

x = randn(5000,1);
h = histogram(x)

在Matlab命令窗口中执行后的输出为:

histogram bins

如果为直方图函数指定一个输出,它将提供一个直方图对象。此对象可以检查直方图属性,例如区间计数或区间宽度。

带有方法和属性的直方图对象如下所示:

>> x = randn(5000,1);
h = histogram(x)


h = 

  Histogram with properties:

             Data: [5000x1 double]
           Values: [2 2 0 1 4 9 15 26 46 65 105 129 151 194 279 303 360 382 389 410 412 346 310 260 221 175 111 ... ] (1x37 double)
          NumBins: 37
         BinEdges: [-3.8000 -3.6000 -3.4000 -3.2000 -3 -2.8000 -2.6000 -2.4000 -2.2000 -2 -1.8000 -1.6000 ... ] (1x38 double)
         BinWidth: 0.2000
        BinLimits: [-3.8000 3.6000]
    Normalization: 'count'
        FaceColor: 'auto'
        EdgeColor: [0 0 0]

  Show all properties

            Annotation: [1x1 matlab.graphics.eventdata.Annotation]
          BeingDeleted: off
             BinCounts: [2 2 0 1 4 9 15 26 46 65 105 129 151 194 279 303 360 382 389 410 412 346 310 260 ... ] (1x37 double)
         BinCountsMode: 'auto'
              BinEdges: [-3.8000 -3.6000 -3.4000 -3.2000 -3 -2.8000 -2.6000 -2.4000 -2.2000 -2 -1.8000 ... ] (1x38 double)
             BinLimits: [-3.8000 3.6000]
         BinLimitsMode: 'auto'
             BinMethod: 'auto'
              BinWidth: 0.2000
            BusyAction: 'queue'
         ButtonDownFcn: ''
              Children: [0x0 GraphicsPlaceholder]
           ContextMenu: [0x0 GraphicsPlaceholder]
             CreateFcn: ''
                  Data: [5000x1 double]
       DataTipTemplate: [1x1 matlab.graphics.datatip.DataTipTemplate]
             DeleteFcn: ''
           DisplayName: 'x'
          DisplayStyle: 'bar'
             EdgeAlpha: 1
             EdgeColor: [0 0 0]
             FaceAlpha: 0.6000
             FaceColor: 'auto'
      HandleVisibility: 'on'
               HitTest: on
         Interruptible: on
             LineStyle: '-'
             LineWidth: 0.5000
         Normalization: 'count'
               NumBins: 37
           Orientation: 'vertical'
                Parent: [1x1 Axes]
         PickableParts: 'visible'
              Selected: off
    SelectionHighlight: on
           SeriesIndex: 1
                   Tag: ''
                  Type: 'histogram'
              UserData: []
                Values: [2 2 0 1 4 9 15 26 46 65 105 129 151 194 279 303 360 382 389 410 412 346 310 260 ... ] (1x37 double)
               Visible: on

要查找直方图区间的数量,可以执行以下操作:

nbins = h.NumBins

在Matlab命令窗口中执行结果如下:

>> nbins = h.NumBins

nbins =

    37

>> 

例3

让我们绘制一个包含5000个随机数的直方图,这些随机数被分成25个等间距的区间。

x = randn(5000,1);
nbins = 25;
h = histogram(x,nbins)

执行后的输出如下:

random numbers

让我们使用以下代码查找区间计数:

counts = h.Values

在Matlab命令窗口中执行后的输出为:

>> counts = h.Values

counts =

  Columns 1 through 21

     2     5    13    23    54   106   167   231   337   419   505   538   570   550   464   357   254   181   109    50    37

  Columns 22 through 25

    14     9     3     2

>>

例4:绘制分类直方图

在这个例子中,我们将生成一个表示投票结果的分类向量。向量中的类别是“是”、“否”或“未决定”。

A = [0 0 1 1 1 0 0 0 0 NaN NaN 1 0 0 0 1 0 1 0 1 0 0 0 1 1 1 1];
C = categorical(A,[1 0 NaN],{'yes','no','undecided'})

在Matlab命令窗口中执行后的输出为:

plot categorical
>> A = [0 0 1 1 1 0 0 0 0 NaN NaN 1 0 0 0 1 0 1 0 1 0 0 0 1 1 1 1];
C = categorical(A,[1 0 NaN],{'yes','no','undecided'})

C = 

  1x27 categorical array

  Columns 1 through 13

     no      no      yes      yes      yes      no      no      no      no      undecided      undecided      yes      no 

  Columns 14 through 27

     no      no      yes      no      yes      no      yes      no      no      no      yes      yes      yes      yes 

>> 

使用分类数据,让我们绘制投票结果的分类直方图,使用0.5的相对条形宽度。

categorical data
广告