在Matplotlib直方图函数中获取区间信息

在Matplotlib直方图函数中获取区间信息

Matplotlib是一个常用于数据可视化的工具包。其中,绘制直方图是一项经常使用的操作。直方图可用于对一组连续型数据进行频率分布的可视化展示。在绘制直方图时,往往需要标记出每个区间的上下界或中点,本文将介绍如何在Matplotlib直方图函数中获取这些区间信息。

直方图

在Matplotlib中,可以使用hist()函数绘制直方图。该函数的完整调用形式如下:

matplotlib.pyplot.hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, *, data=None, **kwargs)

其中,x为数据源,可以是一个数组或序列;bins为区间数量或自定义区间;range为数据的限定范围;density为是否归一化,即将频数除以总数;align为条形的对齐方式;orientation为条形的方向;rwidth为直方图条形宽度的比例;color为直方图颜色;label为直方图标签;stacked为是否堆叠直方图等参数。

将以下数据作为示例数据:

import numpy as np

np.random.seed(42)
data = np.random.normal(10, 5, 10000)

可以使用如下代码绘制一个基础直方图:

import matplotlib.pyplot as plt

plt.hist(data, bins=20, color='lightblue')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()

可以看到,该直方图将数据分成了20个区间,每个区间宽度为(max(data) – min(data)) / 20 ≈ 2.38。但是,上下界信息并没有显示出来。

获取区间信息

要获取区间信息,需要使用numpy的histogram()函数获得数据的频数及区间的边界,然后结合Matplotlib的bar()函数绘制标识区间的线条。下面是相关代码:

counts, bins = np.histogram(data, bins=20)
widths = np.diff(bins)
midpoints = bins[:-1] + widths / 2

fig, ax = plt.subplots()
ax.bar(midpoints, counts, align='center', width=widths, edgecolor='black')

for i in range(20):
    ax.annotate(f'{bins[i]:.1f}~{bins[i+1]:.1f}', xy=(midpoints[i], counts[i]), ha='center', va='bottom')

ax.set_xlabel('Value')
ax.set_ylabel('Frequency')
plt.show()

在这个例子中,使用numpy.histogram()函数获取数据的频数及区间边缘。使用numpy.diff()函数获取每个区间的宽度,并根据从左到右的顺序计算每个区间的中点位置。这个位置将与每个区间的频数一起传递到bar()函数。

在bar()函数中,align参数的默认值为 'center',可以确保条形居中显示。颜色也可以自定义,例如使用 'lightblue'。我们还可以添加一些额外的参数,如边框宽度,使用特定的标签,为每个长方形添加注释等。

结论

本文介绍了如何通过使用Matplotlib直方图函数及numpy库的histogram()函数,获取直方图中的区间信息,并在图表中标识出来。虽然这个过程比绘制基本直方图需要更多的代码,但这样做可以为数据可视化提供更多的信息,使得观察者更容易理解并解释数据的分布情况。更进一步的,我们也可以将上述代码封装成一个函数,方便重复使用。

import matplotlib.pyplot as plt
import numpy as np

def hist_with_range(x, bins=10, **kwargs):
    counts, bins = np.histogram(x, bins=bins)
    widths = np.diff(bins)
    midpoints = bins[:-1] + widths / 2

    fig, ax = plt.subplots()
    ax.bar(midpoints, counts, align='center', width=widths, edgecolor='black', **kwargs)

    for i in range(bins.shape[0] - 1):
        ax.annotate(f'{bins[i]:.1f}~{bins[i+1]:.1f}', xy=(midpoints[i], counts[i]), ha='center', va='bottom')

    ax.set_xlabel('Value')
    ax.set_ylabel('Frequency')
    return ax

# 示例
np.random.seed(42)
data = np.random.normal(10, 5, 10000)
hist_with_range(data, bins=20, color='lightblue')
plt.show()

这段代码将包含所有相关命令,并将其封装成一个带有默认参数的函数,可以通过更改参数轻松地为不同的数据集绘制带有区间信息的直方图。这种封装方式还有助于提高代码的可读性和可维护性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程