【愚公系列】《Python网络爬虫从入门到精通》042-Matplotlib 常用图表的绘制

举报
愚公搬代码 发表于 2025/05/16 21:30:01 2025/05/16
【摘要】 标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳...
标题 详情
作者简介 愚公搬代码
头衔 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。
近期荣誉 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳博主等。
博客内容 .NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
欢迎 👍点赞、✍评论、⭐收藏

🚀前言

在数据分析和科学研究中,图表是传达信息、揭示趋势和洞察数据的重要工具。Matplotlib作为Python中最强大和灵活的绘图库之一,凭借其丰富的绘图功能,成为了数据科学家和分析师们的得力助手。无论是简单的折线图还是复杂的热力图,Matplotlib都能够帮助我们以直观的方式展示数据背后的故事。

在本篇文章《Matplotlib 常用图表的绘制》中,我们将系统地介绍如何利用Matplotlib绘制各种常用图表,包括折线图、柱状图、散点图、饼图等。通过具体的示例与代码演示,你将了解到每种图表的绘制方法、适用场景以及如何进行个性化定制,让你的图表更具表现力和专业性。

🚀一、Matplotlib 常用图表的绘制

🔎1.绘制折线图

🦋1.1 折线图适用场景

  • 数据趋势分析:适用于展示随时间或类别变化的连续数据趋势(如体温变化、股票走势)。
  • 多维度对比:通过多条折线对比不同数据集(如学科成绩、产品销量对比)。
  • 周期性分析:揭示数据周期性规律(如月访问量、季度营收)。

🦋1.2 核心函数与参数

plot() 函数语法

plt.plot(
    x, y, 
    label=None,       # 图例标签
    color=None,       # 线条颜色
    linestyle='-',    # 线型(实线、虚线等)
    marker=None,      # 数据点标记样式
    markersize=6,     # 标记大小
    markerfacecolor=None,  # 标记填充颜色
    alpha=1.0,        # 透明度(0~1)
    **kwargs          # 其他样式参数
)

🦋1.3 多折线图示例代码解析

学生语数外成绩对比

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.show()
在这里插入图片描述在这里插入图片描述

🦋1.4 参数说明

(1) 线条与标记样式

参数 说明 示例值
color 线条颜色 'r'(红)、'#00FF00'(绿)
linestyle 线型 '-'(实线)、'--'(虚线)
marker 数据点标记 'o'(圆圈)、'*'(星形)
markersize (ms) 标记大小 10
markerfacecolor (mfc) 标记填充色 'w'(白色)
alpha 透明度(0透明,1不透明) 0.7

(2) 坐标轴与网格

参数 说明 示例
plt.yticks() 自定义y轴刻度 range(50, 150, 10)
plt.grid() 网格显示 axis='y'(仅y轴网格)

🦋1.5 注意事项

  1. 文件路径与格式

    • 确保Excel文件路径正确,若使用 .xlsx 文件需安装 openpyxl
      pip install openpyxl
      
    • 检查列名是否与代码一致(如 '语文' 列是否存在)。
  2. 中文显示问题

    • SimHei 不可用,替换为其他中文字体(如 'Microsoft YaHei')。
    • 在Linux系统中可能需要手动安装中文字体。
  3. 数据对齐问题

    • 确保所有折线的 x 轴数据(如学生姓名顺序)一致,避免错位。
  4. 样式优化建议

    • 标记大小:根据数据密度调整 markersize,避免重叠。
    • 透明度:多条折线交叉时,通过 alpha 增强可读性。
    • 图例位置:通过 plt.legend(loc='upper right') 调整图例位置。
  5. 扩展功能

    • 数据标签:为关键点添加数值标签:
      for a, b in zip(x1, y1):
          plt.text(a, b, f'{b}', ha='center', va='bottom')
      
    • 注释:使用 plt.annotate() 标注极值点(如最高分)。

🔎2.绘制柱形图

🦋2.1 柱形图简介与适用场景

  • 定义:柱形图通过长方形高度表示数据值,适用于对比离散类别下的数值差异。
  • 适用场景
    • 少量数据集对比(如年度销售额、不同平台销量)
    • 多组数据横向比较(如不同年份、不同产品类别的数据)
  • 变体形式:基本柱形图、堆叠柱形图、分组多柱形图。

🦋2.2 bar() 函数语法与参数详解

函数语法

matplotlib.pyplot.bar(
    x,                  # x轴数据(类别标签)
    height,             # 柱子高度(y轴数据)
    width=0.8,          # 柱子宽度(默认0.8,范围0~1)
    bottom=None,        # 柱子底部基准值(用于堆叠图)
    align='center',     # 对齐方式('center'或'edge')
    color=None,         # 柱子颜色
    alpha=1.0,          # 透明度(0~1)
    label=None,         # 图例标签
    **kwargs            # 其他样式参数(如边缘颜色edgecolor)
)

🦋2.3 基本柱形图示例

年度图书销售额分析代码解析

import matplotlib.pyplot as plt
x=[1,2,3,4,5,6]
height=[10,20,30,40,50,60]
plt.bar(x,height)
plt.show()
在这里插入图片描述在这里插入图片描述
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")  # 生成虚线网格
#x、y轴标签
plt.xlabel('年份')
plt.ylabel('线上销售额(元)')
#图表标题
plt.title('2013—2019年线上图书销售额分析图')
plt.bar(x,height,width = 0.5,align='center',color = 'b',alpha=0.5)
#设置每个柱子的文本标签,format(b,',')格式化销售额为千位分隔符格式
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(['销售额'])  #图例
plt.show()
在这里插入图片描述在这里插入图片描述

🦋2.4 多柱形图示例

多平台销售额对比代码解析

import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('books.xlsx',sheet_name='Sheet2')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x=df['年份']
y1=df['京东']
y2=df['天猫']
y3=df['自营']
width =0.25
#y轴标签
plt.ylabel('线上销售额(元)')
#图表标题
plt.title('2013—2019年线上图书销售额分析图')
plt.bar(x,y1,width = width,color = 'darkorange')
plt.bar(x+width,y2,width = width,color = 'deepskyblue')
plt.bar(x+2*width,y3,width = width,color = 'g')
#设置每个柱子的文本标签,format(b,',')格式化销售额为千位分隔符格式
for a,b in zip(x,y1):
    plt.text(a, b,format(b,','), ha='center', va= 'bottom',fontsize=8)
for a,b in zip(x,y2):
    plt.text(a+width, b,format(b,','), ha='center', va= 'bottom',fontsize=8)
for a, b in zip(x, y3):
    plt.text(a + 2*width, b, format(b, ','), ha='center', va='bottom', fontsize=8)
plt.legend(['京东','天猫','自营'])#图例
plt.show()

输出效果

  • 分组柱子:京东(橙色)、天猫(天蓝)、自营(绿色),宽度各0.25。
  • 标签对齐:通过 x + widthx + 2*width 偏移避免重叠。
  • x轴标签:居中显示在每组柱子下方。
在这里插入图片描述在这里插入图片描述

🦋2.5 注意事项与常见问题

(1) 参数设置技巧

  • 柱子宽度:若绘制 n 个并列柱子,单柱子宽度应满足 width < 1/n(如3组柱子,width=0.25)。
  • 颜色搭配:使用对比色区分不同类别(如 color=['#1f77b4', '#ff7f0e', '#2ca02c'])。

(2) 常见问题解决

问题 原因 解决方案
中文乱码 未指定中文字体 设置 plt.rcParams['font.sans-serif'] = ['SimHei']
柱子重叠 宽度或偏移计算错误 确保 width * n + 间距 < 1
数据标签错位 坐标偏移未匹配柱子位置 检查 x + k*width 计算逻辑

(3) 扩展功能

  • 堆叠柱形图:通过 bottom 参数叠加数据:
    plt.bar(x, y1, label='A')
    plt.bar(x, y2, bottom=y1, label='B')  # y2堆叠在y1上方
    
  • 水平柱形图:使用 plt.barh(x, width) 替代 plt.bar

🔎3.绘制饼形图

🦋3.1 pie() 函数核心参数

语法

matplotlib.pyplot.pie(
    x,                     # 各块比例(自动归一化)
    explode=None,          # 各块离中心距离(突出显示)
    labels=None,           # 各块标签
    colors=None,           # 各块颜色
    autopct=None,          # 百分比显示格式(如'%1.1f%%')
    startangle=0,          # 起始角度(0为x轴正方向)
    shadow=False,          # 是否显示阴影
    radius=1.0,            # 饼图半径
    wedgeprops=None,       # 饼块属性(如边框宽度、颜色)
    textprops=None,        # 文本属性(字体、颜色)
    pctdistance=0.6,       # 百分比标签距圆心比例
    labeldistance=1.1,     # 标签距圆心比例
    center=(0,0),          # 饼图中心坐标
    frame=False,           # 是否显示坐标轴框架
    rotatelabels=False     # 旋转标签
)

🦋3.2 基础饼形图

各省销量占比分析

import pandas as pd
from matplotlib import pyplot as plt
df1 = pd.read_excel('data2.xls')
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']
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)# 设置百分比标签与圆心的距离
# 设置x,y轴刻度一致,保证饼图为圆形
plt.axis('equal')
plt.title('2020年1月各省销量占比情况分析')
plt.show()

输出效果

  • 彩色分块:不同颜色区分各省份。
  • 百分比标签:精确显示各块占比。
  • 标签位置:外侧标签距圆心1.1倍半径,百分比标签距圆心0.6倍半径。
在这里插入图片描述在这里插入图片描述

🦋3.3 分裂饼形图

突出显示最大占比

import pandas as pd
from matplotlib import pyplot as plt
df1 = pd.read_excel('data2.xls')
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']
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 = (0.1,0,0,0,0,0,0,0,0,0))# 设置百分比标签与圆心的距离
# 设置x,y轴刻度一致,保证饼图为圆形
plt.axis('equal')
plt.title('2020年1月各省销量占比情况分析')
plt.show()

输出效果

  • 突出显示:广东省离中心0.1倍半径,其他块无偏移。
在这里插入图片描述在这里插入图片描述

🦋3.4 带阴影的立体饼形图

添加阴影增强立体感

import pandas as pd
from matplotlib import pyplot as plt
df1 = pd.read_excel('data2.xls')
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']
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 = (0.1,0,0,0,0,0,0,0,0,0),shadow=True)# 设置百分比标签与圆心的距离
# 设置x,y轴刻度一致,保证饼图为圆形
plt.axis('equal')
plt.title('2020年1月各省销量占比情况分析')
plt.show()

输出效果

  • 阴影效果:饼图下方显示阴影,增强立体感。
在这里插入图片描述在这里插入图片描述

🦋3.5 环形图

单层环形图

import pandas as pd
from matplotlib import pyplot as plt
df1 = pd.read_excel('data2.xls')
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']
plt.pie(sizes, #绘图数据
        labels=labels,#添加区域水平标签
        colors=colors,# 设置饼图的自定义填充色
        autopct='%.1f%%',# 设置百分比的格式,这里保留一位小数
        #radius =1 , # 设置饼图的半径
        pctdistance=0.85,
        startangle = 180,
        textprops = {'fontsize':9, 'color':'k'}, # 设置文本标签的属性值
        wedgeprops = {'width': 0.4, 'edgecolor': 'k'})
plt.title('2020年1月各省销量占比情况分析')
plt.show()

输出效果

  • 环形结构:通过 wedgeprops={'width': 0.4} 设置环宽为半径的40%。
在这里插入图片描述在这里插入图片描述

🦋3.6 内嵌环形图(双环)

双环形对比分析

import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
df1 = pd.read_excel('data2.xls')
df2=pd.read_excel('data2.xls',sheet_name='2月')
#数据集,x1,x2分别对应外环、内环百分比例
x1=df1['销量']
x2=df2['销量']
#设置饼状图各个区块的颜色
colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold']
#外环
plt.pie(x1,autopct='%.1f%%',radius=1,pctdistance=0.85,colors=colors,wedgeprops=dict(linewidth=2,width=0.3,edgecolor='w'))
#内环
plt.pie(x2,autopct='%.1f%%',radius=0.7,pctdistance=0.7,colors=colors,wedgeprops=dict(linewidth=2,width=0.4,edgecolor='w'))
#图例
legend_text=df1['省']
plt.legend(legend_text,title='地区',frameon=False,bbox_to_anchor=(0.2,0.5))#设置图例标题、位置、去掉图例边框
plt.axis('equal')#设置坐标轴比例以显示为圆形
plt.title('2020年1月2月各省销量占比情况分析')
plt.show()

输出效果

  • 双环对比:外环(1月)与内环(2月)数据对比。
  • 图例优化:图例无边框,位置调整至左侧。
在这里插入图片描述在这里插入图片描述

🦋3.7 注意事项与常见问题

  1. 中文显示问题

    plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体
    plt.rcParams['axes.unicode_minus'] = False    # 解决负号显示
    
  2. 标签重叠

    • 调整 labeldistancepctdistance 参数。
    • 设置 rotatelabels=True 旋转标签。
  3. 环形图宽度

    • wedgeprops={'width': 0.4} 控制环宽(值越大环越窄)。
  4. 百分比格式

    • autopct='%1.1f%%' 保留1位小数,autopct='%d%%' 显示整数。
  5. 多饼图叠加

    • 使用 plt.pie() 多次绘制,调整 radiuswedgeprops 实现层叠效果。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。