Matplotlib中使用plt.hist绘制归一化直方图的全面指南

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

参考:plt.hist normalized

在数据可视化中,直方图是一种常用的图表类型,用于展示数据的分布情况。Matplotlib库提供了强大的plt.hist函数,可以轻松创建直方图。本文将深入探讨如何使用plt.hist函数绘制归一化直方图,以及相关的参数设置和技巧。

1. 什么是归一化直方图?

归一化直方图是一种特殊类型的直方图,其中y轴表示的是概率密度而不是频数。通过归一化,我们可以更好地比较不同样本量的数据分布,或者将直方图与概率密度函数进行对比。

在Matplotlib中,我们可以通过设置density=True参数来创建归一化直方图。让我们看一个简单的例子:

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
data = np.random.randn(1000)

# 绘制归一化直方图
plt.hist(data, bins=30, density=True, alpha=0.7)
plt.title('Normalized Histogram - how2matplotlib.com')
plt.xlabel('Value')
plt.ylabel('Probability Density')
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

在这个例子中,我们生成了1000个服从标准正态分布的随机数,然后使用plt.hist函数绘制了归一化直方图。density=True参数确保了直方图被归一化。

2. plt.hist函数的主要参数

plt.hist函数有许多参数可以用来控制直方图的外观和行为。以下是一些重要的参数:

  • x:输入数据,可以是一维数组或者列表。
  • bins:指定直方图的柱子数量或者边界。
  • range:指定直方图的数据范围。
  • density:是否绘制归一化直方图。
  • weights:为每个数据点指定权重。
  • cumulative:是否绘制累积直方图。
  • histtype:直方图的类型,如’bar’、’step’等。
  • align:柱子的对齐方式。
  • orientation:直方图的方向,’vertical’或’horizontal’。
  • rwidth:柱子的相对宽度。
  • log:是否使用对数刻度。
  • color:柱子的颜色。
  • label:为直方图添加标签。

让我们通过一些例子来详细了解这些参数的使用。

3. 调整bins参数

bins参数可以控制直方图的柱子数量或者边界。我们可以传入一个整数来指定柱子的数量,或者传入一个数组来指定柱子的边界。

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
data = np.random.randn(1000)

# 使用不同的bins值
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(15, 5))

ax1.hist(data, bins=10, density=True)
ax1.set_title('10 bins - how2matplotlib.com')

ax2.hist(data, bins=30, density=True)
ax2.set_title('30 bins - how2matplotlib.com')

ax3.hist(data, bins=50, density=True)
ax3.set_title('50 bins - how2matplotlib.com')

plt.tight_layout()
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

在这个例子中,我们使用了三个不同的bins值(10、30和50)来绘制同一组数据的直方图。可以看到,bins的数量会影响直方图的细节程度。

4. 使用range参数限制数据范围

有时我们可能只对数据的某个特定范围感兴趣。这时可以使用range参数来限制直方图的数据范围。

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
data = np.random.randn(1000)

# 使用range参数
plt.hist(data, bins=30, range=(-2, 2), density=True)
plt.title('Histogram with Range (-2, 2) - how2matplotlib.com')
plt.xlabel('Value')
plt.ylabel('Probability Density')
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子中,我们将直方图的范围限制在了-2到2之间。这样可以更好地关注数据的中心部分。

5. 使用weights参数

weights参数允许我们为每个数据点指定权重。这在处理不均匀采样的数据时特别有用。

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据和权重
data = np.random.randn(1000)
weights = np.random.uniform(0.5, 1.5, 1000)

# 使用weights参数
plt.hist(data, bins=30, weights=weights, density=True)
plt.title('Weighted Histogram - how2matplotlib.com')
plt.xlabel('Value')
plt.ylabel('Weighted Probability Density')
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

在这个例子中,我们为每个数据点随机生成了一个权重,然后在绘制直方图时使用了这些权重。这会影响每个柱子的高度,反映了数据点的相对重要性。

6. 绘制累积直方图

累积直方图可以显示数据的累积分布。我们可以通过设置cumulative=True来绘制累积直方图。

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
data = np.random.randn(1000)

# 绘制累积直方图
plt.hist(data, bins=30, density=True, cumulative=True)
plt.title('Cumulative Histogram - how2matplotlib.com')
plt.xlabel('Value')
plt.ylabel('Cumulative Probability')
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子展示了如何绘制累积直方图。累积直方图的y轴表示小于或等于x轴值的数据比例。

7. 不同的histtype

histtype参数允许我们选择不同类型的直方图表示方式。常用的类型包括’bar’、’step’、’stepfilled’等。

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
data = np.random.randn(1000)

# 不同的histtype
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(15, 5))

ax1.hist(data, bins=30, density=True, histtype='bar')
ax1.set_title('Bar - how2matplotlib.com')

ax2.hist(data, bins=30, density=True, histtype='step')
ax2.set_title('Step - how2matplotlib.com')

ax3.hist(data, bins=30, density=True, histtype='stepfilled')
ax3.set_title('Stepfilled - how2matplotlib.com')

plt.tight_layout()
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子展示了三种不同的histtype:’bar’(默认的柱状图)、’step’(阶梯线图)和’stepfilled’(填充的阶梯图)。

8. 调整柱子的对齐方式

align参数可以控制柱子的对齐方式。可选的值有’left’、’mid’(默认)和’right’。

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
data = np.random.randn(1000)

# 不同的align
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(15, 5))

ax1.hist(data, bins=30, density=True, align='left')
ax1.set_title('Left Aligned - how2matplotlib.com')

ax2.hist(data, bins=30, density=True, align='mid')
ax2.set_title('Mid Aligned - how2matplotlib.com')

ax3.hist(data, bins=30, density=True, align='right')
ax3.set_title('Right Aligned - how2matplotlib.com')

plt.tight_layout()
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子展示了三种不同的柱子对齐方式。虽然差异可能不太明显,但在某些情况下,正确的对齐方式可以提高图表的准确性。

9. 改变直方图的方向

通过设置orientation参数,我们可以改变直方图的方向。默认是垂直的(‘vertical’),但我们也可以创建水平的直方图(‘horizontal’)。

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
data = np.random.randn(1000)

# 垂直和水平直方图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

ax1.hist(data, bins=30, density=True, orientation='vertical')
ax1.set_title('Vertical Histogram - how2matplotlib.com')

ax2.hist(data, bins=30, density=True, orientation='horizontal')
ax2.set_title('Horizontal Histogram - how2matplotlib.com')

plt.tight_layout()
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子展示了如何创建垂直和水平的直方图。水平直方图在某些情况下可能更适合,例如当你有很长的类别标签时。

10. 调整柱子的相对宽度

rwidth参数可以用来调整柱子的相对宽度。默认值是1,表示柱子之间没有间隔。

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
data = np.random.randn(1000)

# 不同的rwidth
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(15, 5))

ax1.hist(data, bins=30, density=True, rwidth=1)
ax1.set_title('rwidth=1 - how2matplotlib.com')

ax2.hist(data, bins=30, density=True, rwidth=0.8)
ax2.set_title('rwidth=0.8 - how2matplotlib.com')

ax3.hist(data, bins=30, density=True, rwidth=0.5)
ax3.set_title('rwidth=0.5 - how2matplotlib.com')

plt.tight_layout()
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子展示了三种不同的rwidth值对直方图外观的影响。较小的rwidth值会在柱子之间创建间隔。

11. 使用对数刻度

对于跨越多个数量级的数据,使用对数刻度可能会更有帮助。我们可以通过设置log=True来实现这一点。

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
data = np.random.lognormal(0, 1, 1000)

# 使用对数刻度
plt.hist(data, bins=30, density=True, log=True)
plt.title('Histogram with Log Scale - how2matplotlib.com')
plt.xlabel('Value')
plt.ylabel('Log(Probability Density)')
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子展示了如何创建一个使用对数刻度的直方图。这对于可视化具有长尾分布的数据特别有用。

12. 自定义颜色和标签

我们可以使用color参数来自定义直方图的颜色,使用label参数为直方图添加标签。

import matplotlib.pyplot as plt
import numpy as np

# 生成两组随机数据
data1 = np.random.normal(0, 1, 1000)
data2 = np.random.normal(2, 1, 1000)

# 绘制两个直方图并自定义颜色和标签
plt.hist(data1, bins=30, density=True, alpha=0.7, color='blue', label='Data 1')
plt.hist(data2, bins=30, density=True, alpha=0.7, color='red', label='Data 2')

plt.title('Customized Histograms - how2matplotlib.com')
plt.xlabel('Value')
plt.ylabel('Probability Density')
plt.legend()
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子展示了如何在同一个图表中绘制两个不同颜色的直方图,并为它们添加标签。alpha参数用于设置透明度,使重叠部分可见。

13. 结合核密度估计

直方图常常与核密度估计(KDE)一起使用,以提供更平滑的分布估计。

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

# 生成随机数据
data = np.random.normal(0, 1, 1000)

# 绘制直方图和KDE
plt.hist(data, bins=30, density=True, alpha=0.7, label='Histogram')
kde = stats.gaussian_kde(data)
x = np.linspace(data.min(), data.max(), 100)
plt.plot(x, kde(x), 'r-', label='KDE')

plt.title('Histogram with KDE - how2matplotlib.com')
plt.xlabel('Value')
plt.ylabel('Density')
plt.legend()
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子展示了如何将直方图与核密度估计结合使用。KDE提供了一个平滑的密度估计,可以帮助识别数据的整体分布形状。

14. 2D直方图

虽然plt.hist主要用于1D数据,但我们也可以使用plt.hist2d来创建2D直方图。

import matplotlib.pyplot as plt
import numpy as np

# 生成2D随机数据
x = np.random.normal(0, 1, 1000)
y = np.random.normal(0, 1, 1000)

# 绘制2D直方图
plt.hist2d(x, y, bins=30, density=True, cmap='viridis')
plt.colorbar(label='Density')
plt.title('2D Histogram - how2matplotlib.com')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子展示了如何创建2D直方图。2D直方图对于可视化两个变量之间的联合分布非常有用。

15. 多子图比较

当我们需要比较多个数据集的分布时,可以使用子图来并排显示多个直方图。

import matplotlib.pyplot as plt
import numpy as np

# 生成三组不同的随机数据
data1 = np.random.normal(0, 1, 1000)
data2 = np.random.normal(2, 1.5, 1000)
data3 = np.random.exponential(2, 1000)

# 创建3x1的子图
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(10, 15))

ax1.hist(data1, bins=30, density=True)
ax1.set_title('Normal Distribution - how2matplotlib.com')

ax2.hist(data2, bins=30, density=True)
ax2.set_title('Shifted Normal Distribution - how2matplotlib.com')

ax3.hist(data3, bins=30, density=True)
ax3.set_title('Exponential Distribution - how2matplotlib.com')

plt.tight_layout()
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子展示了如何创建多个子图来比较不同的数据分布。这种方法可以帮助我们直观地比较不同数据集的特征。

16. 堆叠直方图

堆叠直方图可以用来显示多个类别的数据分布,同时展示总体分布。

import matplotlib.pyplot as plt
import numpy as np

# 生成三组随机数据
data1 = np.random.normal(0, 1, 1000)
data2 = np.random.normal(1, 1, 1000)
data3 = np.random.normal(2, 1, 1000)

# 绘制堆叠直方图
plt.hist([data1, data2, data3], bins=30, density=True, stacked=True, 
         label=['Data 1', 'Data 2', 'Data 3'])
plt.title('Stacked Histogram - how2matplotlib.com')
plt.xlabel('Value')
plt.ylabel('Stacked Density')
plt.legend()
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子展示了如何创建堆叠直方图。堆叠直方图可以帮助我们理解各个子类别对总体分布的贡献。

17. 使用不同的归一化方法

除了概率密度,我们还可以使用其他归一化方法,如百分比。

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
data = np.random.normal(0, 1, 1000)

# 使用百分比归一化
plt.hist(data, bins=30, weights=np.ones(len(data)) / len(data) * 100)
plt.title('Histogram with Percentage Normalization - how2matplotlib.com')
plt.xlabel('Value')
plt.ylabel('Percentage')
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子展示了如何创建一个以百分比为单位的直方图。这种方法可以直观地显示每个bin中数据的百分比。

18. 自定义bin边界

有时我们可能需要自定义bin的边界,以更好地反映数据的特征。

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
data = np.random.exponential(2, 1000)

# 自定义bin边界
custom_bins = [0, 1, 2, 5, 10, 20, np.inf]

plt.hist(data, bins=custom_bins, density=True)
plt.title('Histogram with Custom Bins - how2matplotlib.com')
plt.xlabel('Value')
plt.ylabel('Density')
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子展示了如何使用自定义的bin边界。这在处理不均匀分布的数据时特别有用。

19. 添加统计信息

我们可以在直方图上添加一些统计信息,如均值和标准差。

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
data = np.random.normal(0, 1, 1000)

# 计算统计信息
mean = np.mean(data)
std = np.std(data)

# 绘制直方图
plt.hist(data, bins=30, density=True)
plt.axvline(mean, color='r', linestyle='dashed', linewidth=2)
plt.text(mean*1.1, plt.ylim()[1]*0.9, f'Mean: {mean:.2f}')
plt.text(mean*1.1, plt.ylim()[1]*0.8, f'Std Dev: {std:.2f}')

plt.title('Histogram with Statistics - how2matplotlib.com')
plt.xlabel('Value')
plt.ylabel('Density')
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子展示了如何在直方图上添加均值线和统计信息。这可以帮助读者快速了解数据的关键特征。

20. 使用seaborn库增强直方图

虽然Matplotlib提供了强大的直方图绘制功能,但有时我们可能想要更美观或更复杂的图表。在这种情况下,seaborn库可以是一个很好的选择。

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

# 生成随机数据
data = np.random.normal(0, 1, 1000)

# 使用seaborn绘制直方图和KDE
sns.histplot(data, kde=True, stat='density')
plt.title('Histogram with KDE using Seaborn - how2matplotlib.com')
plt.xlabel('Value')
plt.ylabel('Density')
plt.show()

Output:

Matplotlib中使用plt.hist绘制归一化直方图的全面指南

这个例子展示了如何使用seaborn库绘制直方图和KDE。Seaborn提供了更美观的默认样式和更简单的API来创建复杂的统计图表。

总结

本文详细介绍了如何使用Matplotlib的plt.hist函数绘制归一化直方图,并探讨了各种参数设置和技巧。我们学习了如何调整bins、范围、权重、累积分布等参数,以及如何自定义直方图的外观。此外,我们还探讨了一些高级技巧,如结合KDE、创建2D直方图、使用子图比较多个分布等。

归一化直方图是数据分析和可视化中的重要工具,它可以帮助我们理解数据的分布特征,比较不同数据集,并识别潜在的模式或异常。通过掌握这些技巧,你将能够创建更加信息丰富、视觉上更具吸引力的直方图,从而更有效地传达你的数据洞察。

记住,虽然本文提供了许多示例和技巧,但实际应用中的最佳方法往往取决于你的具体数据和目标。因此,建议你根据自己的需求进行实验和调整,以找到最适合你的数据的可视化方法。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程