【愚公系列】《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)