【愚公系列】《Python网络爬虫从入门到精通》042-Matplotlib 常用图表的绘制
        【摘要】 标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,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 注意事项
- 
文件路径与格式:
- 
确保Excel文件路径正确,若使用 .xlsx文件需安装openpyxl:pip install openpyxl - 
检查列名是否与代码一致(如 '语文'列是否存在)。 
 - 
 - 
中文显示问题:
- 
若 SimHei不可用,替换为其他中文字体(如'Microsoft YaHei')。 - 
在Linux系统中可能需要手动安装中文字体。  
 - 
 - 
数据对齐问题:
- 
确保所有折线的 x轴数据(如学生姓名顺序)一致,避免错位。 
 - 
 - 
样式优化建议:
- 
标记大小:根据数据密度调整 markersize,避免重叠。 - 
透明度:多条折线交叉时,通过 alpha增强可读性。 - 
图例位置:通过 plt.legend(loc='upper right')调整图例位置。 
 - 
 - 
扩展功能:
- 
数据标签:为关键点添加数值标签: 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 + width和x + 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 注意事项与常见问题
- 
中文显示问题:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示 - 
标签重叠:
- 
调整 labeldistance和pctdistance参数。 - 
设置 rotatelabels=True旋转标签。 
 - 
 - 
环形图宽度:
- 
wedgeprops={'width': 0.4}控制环宽(值越大环越窄)。 
 - 
 - 
百分比格式:
- 
autopct='%1.1f%%'保留1位小数,autopct='%d%%'显示整数。 
 - 
 - 
多饼图叠加:
- 
使用 plt.pie()多次绘制,调整radius和wedgeprops实现层叠效果。 
 - 
 
            【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
                cloudbbs@huaweicloud.com
                
            
        
        
        
        
        
        
        - 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)