Python 常用统计图表实战指南

在日常工作和生活中,我们经常会遇到各种各样的数据:每月的外卖账单、每天的步数记录、工作时长与咖啡消耗量......如果只看一堆密密麻麻的数字表格,很容易让人眼花缭乱。

俗话说 "一图胜千言"

统计图表就像是数据的"显微镜"和"翻译官",能帮我们快速发现隐藏在数据背后的规律、偏好甚至"异常"。

下面将结合最接地气的生活场景,一次性搞懂 6 种最常用的统计图表!

(使用 Python 的可视化库 SeabornMatplotlib

准备工作

在开始前,我们先准备好工具包,并加载一份经典的"餐馆消费与小费(tips)"数据集。(这个数据集是 Seaborn 库自带的,不用额外下载)

python 复制代码
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

# 设置画图风格与中文字体支持(根据系统可选)
sns.set_theme(style="whitegrid")
plt.rcParams["font.sans-serif"] = ["SimHei", "Arial Unicode MS"]  # 适配中文
plt.rcParams["axes.unicode_minus"] = False

# 加载内置的餐馆消费数据集
tips = sns.load_dataset("tips")
print(tips.head())

字段说明

total_bill(总账单金额)、tip(小费)、sex(付款人性别)、smoker(是否吸烟)、day(星期几)、time(午餐/晚餐)、size(用餐人数)。

直方图:寻找"大多数人的常态"

在数据分析的日常里,我们总想回答一个朴素的问题:"大多数情况"到底长什么样? 比如,翻开自己的咖啡消费账单,你可能会好奇------每天花在咖啡上的钱,究竟是集中在 15~25 元的平价美式区,还是时不时就跳到 40 元以上的手冲专区?

这种对"主流区间"的追问,正是直方图最擅长的舞台。

直方图 的核心使命,就是把单个连续型数值的分布规律,用柱子的高低直观地"画"出来。它不像折线图关心趋势,也不像饼图在意占比,它只做一件事:把你的数据按数值大小切分成连续的"档位",然后统计每个档位里有多少样本。

于是,哪一档的柱子最高,哪一档就是数据中的"人口稠密区"。

读懂一张直方图,其实并不需要复杂的统计学背景,只要抓住三个视觉线索就够了:

  • 波峰------那个最高的柱子,就是数据里的"主流共识"。如果咖啡消费的柱子峰值落在 20 元附近,你可以放心地说:"看来大部分人和我一样,日常就是一杯平价美式。"
  • KDE 平滑曲线(核密度估计曲线)------它就像给柱状图披上一层流动的纱巾。柱子的高低有时会因分箱宽度而显得跳跃,但加上这条曲线后,整体走势会变得更加柔和清晰,方便你一眼看出分布是单峰、双峰还是平缓起伏。
  • 长尾(偏态)------这是最值得留意的"异常信号"。如果直方图的右侧拖着一条细细长长的尾巴(统计学上称为右偏),那就意味着少数极端值正在悄悄拉高整体上限。比如,大部分人的咖啡消费确实在 20 元左右,但偏偏有位"咖啡土豪"每天一杯 200 元的瑰夏,这条尾巴就是他的存在感。

说到底,直方图的价值不在于告诉你最大值或最小值有多惊人,而是帮你找到那个最安心的"常态区间"------它让你知道,自己是否站在大多数人的那一边,同时也提醒你留意那些游离在主流之外的"少数派故事"。

下次再看到一张带平滑曲线的直方图,不妨先找波峰,再看尾巴,数据里的真实人间,就藏在这两者之间。

实战代码

python 复制代码
plt.figure(figsize=(8, 5))
# kde=True 会自动绘制核密度估计平滑曲线
sns.histplot(tips["total_bill"], kde=True, color="teal", bins=20)
plt.title("顾客消费账单分布(直方图)", fontsize=14)
plt.xlabel("账单金额 ($)")
plt.ylabel("出现频次 (桌数)")
plt.show()

散点图:探索两件事是否"形影不离"

你有没有好奇过,自己复习的时间越长,考试成绩是不是真的就越好?或者,在餐厅吃饭时,账单金额越高,给的小费是否也水涨船高?这类"一个变量如何随另一个变量变化"的问题,正是散点图最经典的用武之地。

它的核心任务是观察两个数值变量之间是否存在某种关联或规律------是携手同涨同跌,还是各走各路,在二维坐标上一目了然。

读懂散点图,其实是在读懂"点的舞蹈":

  • 上升走势是正相关的标志。当你看到点群从左上方向右上方延伸,说明两个变量在"同进退"------消费越高,小费确实给得越多。反之,若点群向右下方倾斜,则意味着负相关(比如运动时长越多,体重越轻)。
  • 聚集区域是最常发生的"日常态"。点最密集的地方,代表了大多数样本所处的典型范围,比如大部分账单集中在 10~20 美元之间。
  • 更高级的玩法是引入颜色与大小 (通过 huesize 参数),把第三、第四个维度也塞进同一张图。例如,用点的颜色表示用餐人数,大小表示就餐时段,这样你就能一眼看出"多人聚餐时不仅消费高,小费比例也更大"这种复合信息。

散点图的价值不在精确的数学关系,而在唤醒直觉------它让你先"看见"趋势,再决定是否要进一步做回归分析。

所以,下次当你怀疑两件事存在关联时,先把它们画成散点图吧,答案往往就藏在那些点的舞步里。

实战代码

python 复制代码
plt.figure(figsize=(8, 5))
# hue 和 size 映射就餐人数,点的颜色和大小都会随人数变化
sns.scatterplot(
    x="total_bill",
    y="tip",
    data=tips,
    hue="size",
    palette="viridis",
    size="size",
    sizes=(30, 200),
)
plt.title("账单金额与小费金额的关系(散点图)", fontsize=14)
plt.xlabel("总账单 ($)")
plt.ylabel("小费 ($)")
plt.show()

箱线图:抓出"摸鱼"与"内卷"的异常值

对比不同组别的数据时,我们往往不只想看平均值,更想知道"大多数人在哪个范围波动"以及"有没有谁特别离谱"。举个例子,你想对比工作日和周末的睡眠时间------周末通常睡得久(整体水平高),但会不会有个别朋友因为熬夜只睡了 2 小时(极端情况)?

箱线图正是为此而生:它能快速对比不同类别下的数据分布范围、居中水平,并且毫不留情地揪出异常值

理解箱线图,就像阅读一个数据的"五数概括"故事:

  • 盒子中间那条粗横线 代表中位数,它是数据的"中间分界点"------50% 的样本小于它,50% 大于它。相比平均数,中位数更加稳健,不容易被极端值带偏。
  • 整个矩形箱子(即四分位距 IQR) 装下了中间 50% 的"中坚力量",从下四分位数(25%)到上四分位数(75%),这个区间就是大多数人的"舒适圈"。
  • 从箱子上下两端伸出的触须 ,一般延伸到非异常范围内的最远值,而触须之外的小黑点 ,就是脱离大部队的离群点------比如周末突然有人吃了 50 美元的超级大餐,或者工作日有人打了超低消费。这些黑点值得你特别关注,它们往往是数据中的"特殊故事"或需要排查的异常情况。

箱线图的魅力在于简洁:一张图就能对比多个类别,把整体分布水平和异常值同时交代清楚。用它来筛查数据中的"异类",比单纯看表格高效得多。

实战代码

python 复制代码
plt.figure(figsize=(8, 5))
sns.boxplot(x="day", y="total_bill", data=tips, palette="Set2")
plt.title("不同星期几的消费水平与波动(箱线图)", fontsize=14)
plt.xlabel("星期")
plt.ylabel("总账单 ($)")
plt.show()

小提琴图:箱线图与密度的"身材秀"

如果说箱线图是数据的"骨架",那么小提琴图就是给它裹上了一层"肌肉"------它结合了箱线图的信息量与直方图的密度轮廓,让你既能看分布位置,又能看分布的胖瘦形态。

想象一下,午餐时大家更倾向于点均一价的快餐(单峰,图形中段鼓鼓的),而晚餐则有人吃简餐、有人聚餐吃大餐(可能形成两个"鼓包",即双峰分布)。

这种细腻的形态差异,只有小提琴图才能生动地展现出来。

读懂小提琴图,重点在于"宽度"和"形状":

  • 小提琴越宽,意味着该价位或数值区间聚集的样本越多,相当于直方图里的"高柱子"。窄的地方则是人群稀少的区域。
  • 葫芦腰或双峰是特别有趣的信号。如果图形中间突然凹陷、两端鼓起,说明该群体内部出现了明显的"两极分化"------比如晚餐消费既有 10 美元左右的轻食族,也有 40 美元以上的豪华聚餐族,中间档反而不常见。
  • 同时,小提琴图内部仍然保留了箱线图的关键要素(中位数、四分位数),所以你不必放弃对典型值的关注。

总的来说,小提琴图是"探察分布形状"的利器,尤其适合对比多个组别之间的内在结构差异。当你怀疑不同群体可能有不同的分布模式时,不妨试试这把"小提琴"。

实战代码

python 复制代码
plt.figure(figsize=(8, 5))
sns.violinplot(x="time", y="total_bill", data=tips, palette="Pastel1")
plt.title("午餐与晚餐消费分布对比(小提琴图)", fontsize=14)
plt.xlabel("用餐时段")
plt.ylabel("总账单 ($)")
plt.show()

成对关系图:数据的"全身全景体检"

如果你手头有一堆数值变量,比如身高、体重、血压、体脂率,你不仅想分别看它们的分布,还想一次性了解两两之间的关联,那么成对关系图就是你的"体检全景报告"。

把数据集中所有数值变量两两配对,生成一张大矩阵图,让你以全局视角扫描各个维度的联动关系,而不用反复写循环画图。

读这张大图,可以按对角线和非对角线分别来看:

  • 对角线 (自己 vs 自己)通常展示单变量的自身分布------你可以选择直方图或密度曲线(KDE),相当于一次看到所有变量的"个人档案"。
  • 非对角线 上则是两两变量的散点图,每一个小格子都代表两个变量的交叉关系。扫一眼就能快速锁定哪些变量可能有关联(比如体重和血压)、哪些彼此独立(比如身高和心率)。
  • 更高级的用法是增加 hue** 分组上色**,比如按性别或吸烟与否着不同颜色。这样,你不仅能看整体关系,还能直观对比不同人群(男 vs 女)在同样变量对上的表现差异------是趋势一致但水平不同,还是方向完全相反?

成对关系图的代价是信息量较大,但当你想快速熟悉一份新数据集时,它绝对是最省时省力的"全景扫描仪"。一行代码,全局在握。

实战代码

python 复制代码
# 一行代码生成多维全景关系图
sns.pairplot(tips, hue="sex", palette="husl", diag_kind="kde")
plt.show()

相关性热力图:谁和谁是"铁哥们"?

当我们面对一堆数值变量,想知道"谁和谁关系最铁"时,散点图虽然直观,但变量一多就容易眼花缭乱。

这时,相关性热力图就派上了用场------它用色彩的冷暖来量化展示多个变量之间的线性相关系数(范围从 -1 到 1),把复杂的关联关系浓缩成一张色彩矩阵,让你一眼锁定最强(或最弱)的联动关系。

解读热力图,本质是在"读颜色":

  • 颜色越接近深暖色(如红色) ,代表相关系数接近 +1,也就是强正相关------你涨我也涨,比如账单金额越大,小费通常也越多。
  • 颜色越接近深冷色(如蓝色) ,代表相关系数接近 -1,即强负相关------你涨我就跌,例如户外温度越高,供暖费用可能越低。
  • 颜色接近白色或浅色,说明相关系数接近 0,两者基本"井水不犯河水"(比如用餐人数与星期几的消费金额关系微弱)。

热力图的另一个好处是能在图上直接标注数字(annot=True),让精确的相关系数一目了然。不过要记住,相关系数只衡量线性关系,非线性但很强的关联(比如 U 形曲线)可能显示为弱相关,所以热力图更适合作为探索的第一站,而非定论。

实战代码

python 复制代码
plt.figure(figsize=(7, 5))
# 计算数值型字段的相关系数矩阵
corr_matrix = tips.corr(numeric_only=True)

# 绘制热力图并显示数值
sns.heatmap(corr_matrix, annot=True, cmap="coolwarm", fmt=".2f", vmin=-1, vmax=1)
plt.title("数值变量之间的相关性矩阵(热力图)", fontsize=14)
plt.show()

总结:我该选用哪种图?

为了方便大家在实际分析时快速选择,下面这张"选图指南"把每种图的核心场景和看点归纳在一起。

你可以根据自己的问题类型,对号入座:

分析目标 推荐图表 核心价值
看单变量的分布和主流区间 直方图 (histplot) 找波峰、看偏态、辨群体重心
探寻两个指标的联动趋势 散点图 (scatterplot) 找正负相关、聚类与特殊模式
对比不同组别的分布与异常点 箱线图 (boxplot) 查中位数、分位数与抓极端异常值
观察各组内部的详细密度轮廓 小提琴图 (violinplot) 看分布形状、发现双峰/多峰亚群
多变量全面联动探索 成对关系图 (pairplot) 全景扫描、一次性看清多维联系
量化多指标之间的关联紧密度 相关性热力图 (heatmap) 色彩映射相关系数,一目了然

不妨挑选你手头的一份日常数据(比如微信步数、记账流水或打卡记录),挑两张图画一画,探索一下属于你自己的数据故事吧!

相关推荐
魔镜er2 小时前
11-循环神经网络
人工智能·pytorch·python·深度学习·神经网络
cc5725026532 小时前
2026 秋招复盘,2027 届数据分析师校招完整备战方案
数据分析
Patrick在香港2 小时前
Python 抓香港政府公报 RSS:中英两个 feed 的 guid 零重合,lastBuildDate 停在 2016 年
python·数据处理·数据抓取·香港·rss
宁渡AI大模型2 小时前
河南宁渡科技有限公司|宁渡课堂 AI 全栈面试分享,AI 应用开发高频考点汇总
java·c++·人工智能·python·深度学习·神经网络·rag
Highcharts.js2 小时前
Highcharts 多Y轴折线图入门讲解:让不同单位的数据在一张图中正确表达
信息可视化·数据挖掘·数据分析·highcharts·图表工具·自定义图表·y轴多图
troy1283 小时前
Python 基础语法(六):函数与模块、文件操作、异常处理
开发语言·python
小叶肥辉3 小时前
LangChain链和LangGraph图的学习笔记【四】——(1)调用方法:invoke(2)提示语模板:PromptTemplate
python·langchain·prompt
Lynne3093 小时前
为什么工业数据越来越需要在现场处理?边缘计算正在解决什么问题?
网络·数据分析·数据