【Python数据可视化】Matplotlib五大核心图表全解析:散点图/折线图/柱形图/饼图/箱线图实战指南

目录

  1. 前言:数据可视化的重要性

  2. 散点图:发现变量间的关系

  3. 折线图:展示趋势变化

  4. 柱形图:比较分类数据

  5. 饼图:呈现比例构成

  6. 箱线图:分析数据分布

  7. 综合对比与选用指南

  8. 常见问题解答

  9. 总结与资源


1. 前言:数据可视化的重要

数据可视化是数据分析中不可或缺的一环,它能够:

  • 直观呈现复杂数据关系

  • 快速识别数据模式和异常值

  • 有效传达分析结果给非技术人员

Matplotlib作为Python最基础也是最强大的可视化库,提供了丰富的图表类型。本文将重点讲解五种最常用的图表类型,通过真实案例演示如何从数据到可视化呈现的全过程。

你将学到
✅ 5种核心图表的适用场景
✅ 每种图表的定制化技巧
✅ 商业分析中的实际应用
✅ 常见问题的解决方案

所有代码均可直接复制使用,并附带示例数据集。


2. 散点图:发现变量间的关系

散点图(Scatter Plot) 是一种用于展示 两个连续变量之间关系 的数据可视化图表。它通过在二维坐标系中绘制数据点(每个点代表一个观测值)来揭示变量间的 相关性、分布模式或异常值

适用场景

  • 两个连续变量的相关性分析

  • 聚类分析可视化

  • 异常值检测

基础代码

import matplotlib.pyplot as plt
import numpy as np

# 生成示例数据
np.random.seed(42)
x = np.random.rand(50) * 10
y = 2 * x + np.random.randn(50) * 2

# 绘制散点图
plt.figure(figsize=(8, 6))
plt.scatter(x, y, c='steelblue', alpha=0.7, edgecolors='white', s=100)
plt.title('广告投入与销售额关系', fontsize=14)
plt.xlabel('广告投入(万元)', fontsize=12)
plt.ylabel('销售额(万元)', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()

高级技巧

  1. 添加回归线

from scipy import stats
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
plt.plot(x, intercept + slope*x, 'r--', label=f'y={slope:.2f}x+{intercept:.2f}')
plt.legend()
  1. 气泡图效果

sizes = np.random.randint(10, 200, size=50)
plt.scatter(x, y, s=sizes, alpha=0.5)

实践例子代码展示:

# 绘制简单散点图:用scatter()函数
import matplotlib.pyplot as plt

x=[1,2,3,4,5,6]
y=[19,24,37,43,55,68]

plt.scatter(x, y, color= 'r')
plt.show()


3. 折线图:展示趋势变化

折线图(Line Chart/Line Plot) 是一种通过 线段连接数据点 来展示 连续变量随时间或有序类别变化趋势 的可视化图表。它强调数据的 连续性、趋势和波动,是时间序列分析中最常用的工具之一。

适用场景

  • 时间序列数据

  • 连续变量变化趋势

  • 多组数据对比

基础代码

# 示例数据
months = ['1月', '2月', '3月', '4月', '5月', '6月']
sales_A = [23, 45, 32, 56, 43, 67]
sales_B = [34, 28, 45, 38, 52, 49]

plt.figure(figsize=(10, 6))
plt.plot(months, sales_A, marker='o', label='产品A', linewidth=2)
plt.plot(months, sales_B, marker='s', label='产品B', linestyle='--')
plt.title('上半年产品销售趋势', fontsize=14)
plt.ylabel('销售额(万元)', fontsize=12)
plt.legend()
plt.grid(True, axis='y')
plt.show()

高级技巧

  1. 双Y轴折线图

fig, ax1 = plt.subplots(figsize=(10,6))
ax1.plot(months, sales_A, 'b-', marker='o')
ax1.set_ylabel('产品A销售额', color='b')

ax2 = ax1.twinx()
ax2.plot(months, sales_B, 'r-', marker='s')
ax2.set_ylabel('产品B销售额', color='r')
  1. 面积图

plt.stackplot(months, sales_A, sales_B, alpha=0.5)

实践例子代码展示:

import pandas as pd
import matplotlib.pyplot as plt
df1=pd.read_excel('data.xls')              #导入Excel文件
#多折线图
x1=df1['姓名']
y1=df1['语文']
y2=df1['数学']
y3=df1['英语']
plt.rcParams['font.sans-serif']=['SimHei']    #解决中文乱码
plt.rcParams['xtick.direction'] = 'out'       #x轴的刻度线向外显示
plt.rcParams['ytick.direction'] = 'in'        #y轴的刻度线向内显示
plt.title('语数外成绩大比拼',fontsize='18')   #图表标题
plt.plot(x1,y1,label='语文',color='r',marker='p')
plt.plot(x1,y2,label='数学',color='g',marker='.',mfc='r',ms=8,alpha=0.7)
plt.plot(x1,y3,label='英语',color='b',linestyle='-.',marker='*')
plt.grid(axis='y')                             #显示网格关闭y轴
plt.ylabel('分数')
plt.yticks(range(50,150,10))
plt.legend(['语文','数学','英语'])             #图例
plt.savefig('image.png')
plt.show()


4. 柱形图:比较分类数据

柱形图(Bar Chart) 是一种用 垂直或水平矩形条 表示 分类数据对比 的统计图表。每个柱子的高度(或长度)对应一个 离散类别 的数值大小,用于直观比较不同类别之间的差异。

适用场景

  • 分类数据对比

  • 时间序列的离散表示

  • 多组数据并列比较

基础代码

categories = ['电子产品', '服装', '食品', '家居']
q1_sales = [45, 32, 28, 39]
q2_sales = [52, 38, 31, 43]

x = np.arange(len(categories))
width = 0.35

fig, ax = plt.subplots(figsize=(10,6))
rects1 = ax.bar(x - width/2, q1_sales, width, label='第一季度')
rects2 = ax.bar(x + width/2, q2_sales, width, label='第二季度')

ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()

# 添加数据标签
def autolabel(rects):
    for rect in rects:
        height = rect.get_height()
        ax.annotate(f'{height}',
                   xy=(rect.get_x() + rect.get_width() / 2, height),
                   xytext=(0, 3),
                   textcoords="offset points",
                   ha='center', va='bottom')

autolabel(rects1)
autolabel(rects2)

plt.show()

变体图表

  1. 堆叠柱形图

plt.bar(categories, q1_sales, label='Q1')
plt.bar(categories, q2_sales, bottom=q1_sales, label='Q2')
  1. 水平柱形图

plt.barh(categories, q1_sales)

实践例子代码展示:

# 2025.05.15课堂作业(绘制柱形图图表)
# 根据“books.xlsx”表格的数据,绘制如下图形。 要求将代码和输出结果截图上传。

import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('books.xlsx')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x=df['年份']
height=df['销售额']
plt.grid(axis="y", which="major")  # 只在y轴上生成虚线网格。which="major":只显示主刻度线对应的网格线
#x、y轴标签
plt.xlabel('年份')
plt.ylabel('线上销售额(元)')
#图表标题
plt.title('2013-2019年线上图书销售额分析图')
plt.bar(x,height,width = 0.5,align='center',color = 'b',alpha=0.5,bottom=0.8)  #alpha=0.5透明度

#设置每个柱子的文本标签, format(b,',')格式化销售额为千位分隔符格式
#for a,b in zip(x,height):遍历x轴位置和柱形高度值
# plt.text() - 添加文本标签,具体参数解释如下:
    # a - x坐标位置
    # b - y坐标位置(柱形顶部)
    # format(b,',') - 将数值格式化为带千位分隔符的字符串
    # ha='center' - 水平对齐方式为居中
    # va='bottom' - 垂直对齐方式为底部对齐
    # fontsize=9 - 字体大小
    # color='b' - 蓝色文本
    # alpha=0.9 - 透明度0.9
for a,b in zip(x,height):
    plt.text(a, b,format(b,','), ha='center', va= 'bottom',fontsize=9,color = 'b',alpha=0.9)

plt.legend(['销售额'])  # 显示图例


5. 饼图:呈现比例构成

饼图(Pie Chart) 是一种用 圆形分割扇形区域 来展示 整体中各部分占比关系 的统计图表。每个扇区的面积(或弧长)对应一个类别的数值比例,适用于强调 部分与整体的构成关系

适用场景

  • 显示整体中各部分占比

  • 强调某个重要组成部分

  • 比例关系可视化

基础代码

labels = ['一线城市', '二线城市', '三线城市', '其他']
sizes = [45, 30, 15, 10]
explode = (0.1, 0, 0, 0)  # 突出显示一线城市

plt.figure(figsize=(8,8))
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
       shadow=True, startangle=90)
plt.title('用户地域分布', fontsize=14)
plt.show()

高级技巧

  1. 环形图

plt.pie(sizes, wedgeprops=dict(width=0.3))
  1. 多级饼图

# 需要分层处理数据

实践例子代码展示:

# 代码 05-19 
import pandas as pd
from matplotlib import pyplot as plt
df1 = pd.read_excel('data2.xlsx')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.figure(figsize=(5,3)) #设置画布大小
labels = df1['地区']
sizes = df1['销量']
#设置饼形图每块的颜色
colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold']

# 分裂饼图参数:explode
explode = (0.1, 0,0,0,0,0,0,0,0,0)

plt.pie(sizes, #绘图数据
        labels=labels,#添加区域水平标签
        colors=colors,# 设置饼图的自定义填充色
        labeldistance=1.02,#设置各扇形标签(图例)与圆心的距离
        autopct='%.1f%%',# 设置百分比的格式,这里保留一位小数
        startangle=90,# 设置饼图的初始角度
        radius = 0.5, # 设置饼图的半径
        center = (0.2,0.2), # 设置饼图的原点
        textprops = {'fontsize':9, 'color':'k'}, # 设置文本标签的属性值
        pctdistance=0.6, # 设置百分比标签与圆心的距离
        explode=explode, #分裂饼图
        shadow=True # 立体感带阴影饼图
       )
# 设置x,y轴刻度一致,保证饼图为圆形
plt.axis('equal')
plt.title('2020年1月各地区销量占比情况分析')




6. 箱线图:分析数据分布

箱线图(Box Plot,又称盒须图) 是一种用于展示 数值数据分布特征 的统计图表,通过五数概括(最小值、第一四分位数、中位数、第三四分位数、最大值)和潜在异常值,直观反映数据的 离散程度、偏态和异常情况

  • 数据分布形态展示

  • 异常值检测

  • 多组数据分布比较

基础代码

# 生成示例数据
data = [np.random.normal(0, std, 100) for std in range(1,4)]

fig, ax = plt.subplots(figsize=(8,6))
ax.boxplot(data, vert=True, patch_artist=True,
          labels=['组1', '组2', '组3'])

ax.set_title('三组数据分布比较')
plt.show()

元素解释

  • 箱体:显示四分位距(IQR)

  • 中线:中位数位置

  • 须线:1.5倍IQR范围

  • 离群点:超出须线的数据点

实践例子代码展示:

# 箱形图是一种用作显示一组数据分布情况的统计图,因型状如箱子而得名。箱子的顶端和底端,分别代表上下四分位数。
# 箱子中间的是中位数线,它将箱子一分为二。箱形图最大的优势是,它以一种简单的方式,概括出一个或多个数值变量的分布,
# 同时又不会占据太多空间。通过箱形图,我们可以很快知道一些关键的统计值,如中位数、上下四分位数等。

# 请读取表格“temperature.csv”数据,对 “temp”列的数据绘制箱形图。要求输出结果如下图。并读图。最后请将代码和输出结果截图上传。

import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('temperature.csv')

aa = df['temp'].isna().sum()  # 统计空值个数
print(aa)

# 删除 空值的行数据
df.dropna(subset=['temp'], inplace= True)

# 绘制箱线图
plt.boxplot(df['temp'])

plt.xlabel('列名')
plt.ylabel('温度值')
plt.title('箱型图')


7. 综合对比与选用指南

图表类型最佳使用场景需避免的情况
散点图展示两个连续变量关系数据点过多导致重叠
折线图时间序列或有序数据非连续或无序分类数据
柱形图分类数据比较超过7-8个类别
饼图显示整体中各部分占比部分占比相近或类别过多
箱线图数据分布形态分析需要展示具体数据点

选用流程图

  1. 要展示趋势?→ 折线图

  2. 要比较数值?→ 柱形图

  3. 要分析关系?→ 散点图

  4. 要显示构成?→ 饼图

  5. 要分析分布?→ 箱线图


8. 常见问题解答

Q1:中文显示乱码怎么办?

plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']  # Mac

Q2:如何保存高清图片?

plt.savefig('output.png', dpi=300, bbox_inches='tight')

Q3:如何调整图例位置?

plt.legend(loc='upper right')  # 其他选项:'best', 'upper left'等


9. 总结与资源

核心要点回顾

  • 散点图揭示变量关系

  • 折线图展示趋势变化

  • 柱形图用于分类比较

  • 饼图显示比例构成

  • 箱线图分析数据分布

进阶学习资源

  • Matplotlib官方文档

  • 《Python数据可视化实战》

  • Seaborn库的高级统计图表

  • 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值