0

0

怎样用Python绘制数据分布图?hist可视化技巧

爱谁谁

爱谁谁

发布时间:2025-07-04 18:49:16

|

445人浏览过

|

来源于php中文网

原创

使用python绘制数据分布图最常用的方法是matplotlib的hist函数和seaborn的histplot函数。1. plt.hist是基础绘图方法,可自定义性强;2. sns.histplot功能更强大且美观,默认支持kde曲线;3. bins参数影响直方图形态,建议先用bins='auto'自动选择,再根据数据特征手动调整;4. seaborn支持hue和multiple参数进行多组数据对比,如叠加、堆叠等模式;5. 对偏斜数据可采用对数变换、设置x轴范围或剔除异常值等策略提升可视化效果。合理选择工具与参数组合,能更清晰揭示数据分布特征。

怎样用Python绘制数据分布图?hist可视化技巧

用Python绘制数据分布图,最直接、最常用的方法就是利用matplotlib库的hist函数或seaborn库的histplot函数来创建直方图。它们能非常直观地展示数据的分布形态,比如集中趋势、离散程度以及是否存在多个峰值。

怎样用Python绘制数据分布图?hist可视化技巧

解决方案

要绘制数据分布图,特别是直方图,你可以从以下基础代码开始:

怎样用Python绘制数据分布图?hist可视化技巧
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

# 假设我们有一些随机生成的数据
np.random.seed(42) # 为了结果可复现
data = np.random.randn(1000) * 15 + 100 # 模拟一个正态分布数据

# 使用Matplotlib绘制直方图
plt.figure(figsize=(10, 6)) # 设置图表大小
plt.hist(data, bins=30, color='skyblue', edgecolor='black', alpha=0.7)
plt.title('数据分布直方图 (Matplotlib)', fontsize=16)
plt.xlabel('数值', fontsize=12)
plt.ylabel('频数', fontsize=12)
plt.grid(axis='y', alpha=0.75) # 添加网格线
plt.show()

# 使用Seaborn绘制直方图,通常更美观且功能更强大
plt.figure(figsize=(10, 6))
sns.histplot(data, bins=30, kde=True, color='lightcoral', edgecolor='black')
plt.title('数据分布直方图 (Seaborn)', fontsize=16)
plt.xlabel('数值', fontsize=12)
plt.ylabel('频数/密度', fontsize=12)
plt.grid(axis='y', alpha=0.75)
plt.show()

这段代码展示了两种主要的绘制方式。plt.hist是基础,而sns.histplot则在美观度和功能上做了很多增强,比如自带核密度估计(KDE)曲线。bins参数是核心,它决定了数据被分成多少个区间,直接影响直方图的“形状”。

立即学习Python免费学习笔记(深入)”;

如何选择合适的直方图分箱(bins)数量?

选择直方图的分箱数量(bins)确实是个艺术活,也是直方图可视化中一个常常让人纠结的问题。分箱数量太多或太少,都会让数据分布的真实面貌变得模糊。我个人在做数据探索时,通常会先尝试一些经验法则,然后根据数据的具体特征进行微调。

怎样用Python绘制数据分布图?hist可视化技巧

如果分箱数量太少,你可能会错过数据中重要的模式或者多个峰值;反过来,如果分箱数量太多,图表会变得过于“锯齿状”,噪音信息会被放大,反而难以看出整体趋势。

一些常用的经验法则或算法包括:

  • Sturges' Rule: bins = log2(n) + 1,其中n是数据点的数量。这个规则比较保守,通常分箱数量较少。
  • Freedman-Diaconis Rule: 这种方法基于数据的四分位数间距(IQR),对异常值不那么敏感,被认为是比较稳健的选择。
  • Scott's Rule: 基于数据的标准差,适用于近似正态分布的数据。
  • auto选项: Matplotlib和Seaborn的bins='auto'选项会尝试根据数据自动选择一个“最佳”的箱数,通常会综合考虑上述一些算法。这通常是我开始探索时的首选。

我的做法是,先用bins='auto'跑一下看看效果,如果觉得不够清晰,比如数据看起来有点偏斜,或者怀疑有多个集群但图上没体现出来,我就会手动调整bins的值。可以尝试增加或减少,看看哪种能更好地揭示数据的内在结构。有时候,我会直接给一个整数,比如bins=20bins=50,甚至直接传入一个列表,指定每个箱子的边界,这在处理特定范围或分类数据时特别有用。

matlab基础知识简介 中文WORD版
matlab基础知识简介 中文WORD版

MATLAB(矩阵实验室)是MATrix LABoratory的缩写,是一款由美国The MathWorks公司出品的商业数学软件。MATLAB是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。除了矩阵运算、绘制函数/数据图像等常用功能外,MATLAB还可以用来创建用户界面及与调用其它语言(包括C,C++和FORTRAN)编写的程序。MATLAB基础知识;命令窗口是用户与MATLAB进行交互作业的主要场所,用户输入的MATLAB交互命令均在命令窗口执行。 感兴趣的朋友可以

下载
# 示例:不同bins数量的影响
plt.figure(figsize=(15, 5))

plt.subplot(1, 3, 1)
sns.histplot(data, bins=5, kde=True, color='skyblue', edgecolor='black')
plt.title('Bins = 5 (太少)')

plt.subplot(1, 3, 2)
sns.histplot(data, bins='auto', kde=True, color='lightcoral', edgecolor='black')
plt.title('Bins = Auto (推荐)')

plt.subplot(1, 3, 3)
sns.histplot(data, bins=100, kde=True, color='lightgreen', edgecolor='black')
plt.title('Bins = 100 (太多)')

plt.tight_layout()
plt.show()

通过对比不同bins数量的直方图,你就能更好地理解数据。没有一个放之四海而皆准的“完美”分箱数,关键在于它能否帮助你理解数据的真实分布。

如何使用Seaborn的histplot绘制更复杂的数据分布?

如果说Matplotlib的hist是基础工具,那么Seaborn的histplot则是在此之上提供更高级、更美观的封装,尤其在处理多变量或分类数据时,它的优势非常明显。histplot不仅能绘制直方图,还能结合核密度估计(KDE)曲线,提供更平滑的分布概览。

histplot的强大之处在于它的参数设计,比如kdehuemultiple等。

  • kde=True: 这是我最喜欢的功能之一。它会在直方图上方叠加一条平滑的核密度估计曲线,这条曲线在一定程度上能弥补直方图因分箱选择不同而带来的视觉偏差,让我对数据的整体形态有更直观的感受,尤其是在数据量比较大的时候。
  • hue: 当你想根据某个分类变量来比较不同组的数据分布时,hue参数简直是神器。比如,你想看看男性和女性在某个指标上的分布差异,直接把性别列传给hue就行。
  • multiple: 当你使用了hue参数后,multiple参数可以控制不同组的直方图如何显示,比如'layer'(叠加,默认)、'stack'(堆叠)、'dodge'(并排)、'fill'(填充)。我个人比较常用'layer''stack',看具体想表达什么。'layer'适合看不同组的重叠区域,而'stack'则能清晰地看到每个组对总体的贡献。
# 假设我们有一个包含分类变量的数据集
import pandas as pd
np.random.seed(42)
data_df = pd.DataFrame({
    'Value': np.concatenate([np.random.normal(loc=90, scale=10, size=500),
                             np.random.normal(loc=110, scale=15, size=500)]),
    'Category': ['A'] * 500 + ['B'] * 500
})

plt.figure(figsize=(12, 6))
# 使用hue参数按类别绘制直方图,并叠加KDE曲线
sns.histplot(data=data_df, x='Value', hue='Category', kde=True,
             palette='viridis', edgecolor='black', alpha=0.7, multiple='layer')
plt.title('按类别划分的数据分布 (Seaborn)', fontsize=16)
plt.xlabel('数值', fontsize=12)
plt.ylabel('频数/密度', fontsize=12)
plt.grid(axis='y', alpha=0.75)
plt.show()

# 尝试不同的multiple模式
plt.figure(figsize=(12, 6))
sns.histplot(data=data_df, x='Value', hue='Category', kde=False,
             palette='viridis', edgecolor='black', alpha=0.7, multiple='stack')
plt.title('按类别堆叠的直方图', fontsize=16)
plt.xlabel('数值', fontsize=12)
plt.ylabel('频数', fontsize=12)
plt.grid(axis='y', alpha=0.75)
plt.show()

通过这些参数的组合,histplot能够非常灵活地展示复杂数据的分布特征,让你能够从更多维度去理解数据。

处理偏斜数据或异常值对直方图可视化的影响

在实际工作中,数据很少是完美对称的,偏斜数据和异常值是常态。当数据严重偏斜(例如,右偏,尾部在右侧很长)或者存在极端异常值时,直接绘制的直方图往往会变得难以解读。大部分数据会挤在图表的一小部分,而长长的尾巴或孤立的异常值则会让大部分箱子都是空的,或者只有一个箱子高得离谱。

我个人的经验是,如果数据偏得厉害,或者有几个极端的离群点,直方图根本看不出所以然。这时候,我通常会考虑以下几种策略:

  1. 数据变换(Transformation): 对于右偏数据,最常用的方法是对数变换(np.log()np.log1p())。对数变换可以有效地“压缩”大数值的范围,使得偏斜的分布变得更接近对称,从而在直方图上更容易观察。 对于左偏数据(较少见),可以考虑平方变换或指数变换。 当然,变换后的数据解读时需要注意,因为轴的含义已经改变了。

  2. 调整轴的范围(xlim: 如果异常值只是少数几个,并且你主要关注大部分数据的分布,可以手动设置x轴的显示范围,排除那些极端值。但这也有缺点,就是你隐藏了异常值,可能会丢失一些重要信息。

  3. 分位数截断(Winsorization)或剔除异常值: 在某些分析中,你可能会选择将超出某个分位数(比如99%或1%)的数据截断到该分位数的值,或者直接将这些异常值从数据集中移除。但这种方法需要非常谨慎,因为它改变了原始数据,可能会影响后续的统计分析。

# 模拟一个高度右偏的数据
np.random.seed(42)
skewed_data = np.exp(np.random.normal(loc=2, scale=1, size=1000)) # 生成一个对数正态分布

plt.figure(figsize=(12, 5))

plt.subplot(1, 2, 1)
sns.histplot(skewed_data, bins=50, kde=True, color='purple', edgecolor='black')
plt.title('原始偏斜数据分布', fontsize=16)
plt.xlabel('数值', fontsize=12)
plt.ylabel('频数/密度', fontsize=12)
plt.grid(axis='y', alpha=0.75)

# 对数变换
log_transformed_data = np.log1p(skewed_data) # 使用log1p处理可能包含0或小正数的情况

plt.subplot(1, 2, 2)
sns.histplot(log_transformed_data, bins=30, kde=True, color='darkgreen', edgecolor='black')
plt.title('对数变换后数据分布', fontsize=16)
plt.xlabel('Log(1+数值)', fontsize=12)
plt.ylabel('频数/密度', fontsize=12)
plt.grid(axis='y', alpha=0.75)

plt.tight_layout()
plt.show()

从上面的例子可以看出,对数变换能显著改善偏斜数据的直方图可视化效果,让其分布形态更容易被理解。在处理实际问题时,选择哪种方法取决于你对数据的理解以及想要传达的信息。记住,没有万能的解决方案,多尝试、多思考,才能找到最适合你数据的可视化方式。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

746

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

634

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

758

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1260

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

705

2023.08.11

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

80

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号