名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
订阅专栏:《Python星球日记》
目录
- 一、Matplotlib 简介
- 1. 什么是 Matplotlib?为什么使用 Matplotlib?
- 2. 安装与导入
- 二、基本绘图
- 1. 绘制折线图:`plot()`
- 绘制多条线
- 自定义线条样式
- 2. 绘制柱状图:`bar()` 和 `barh()`
- 垂直柱状图
- 水平柱状图
- 分组柱状图
- 3. 绘制饼图:`pie()`
- 三、图形美化
- 1. 添加标题、标签、图例
- 标题和标签
- 图例
- 2. 调整颜色、样式、网格
- 设置样式
- 设置颜色和透明度
- 添加网格
- 3. 调整坐标轴
- 4. 子图布局
- 四、练习:可视化销售数据趋势
- 1️⃣准备数据
- 2️⃣绘制销售趋势图表
- 3️⃣分析与总结
- 五、总结与拓展
- 1. 核心知识点回顾
- 2. 进阶技巧
- 3. 学习资源推荐
👋 专栏介绍: Python星球日记专栏介绍(持续更新ing)
✅ 上一篇: Python星球日记 - 第22天:NumPy 基础
欢迎来到Python星球🪐的第26天!
今天我们将学习Matplotlib,Python中最流行的数据可视化库。通过本文,你将了解如何创建各种类型的图表,以及如何美化它们,让你的数据"说话"更有说服力。
一、Matplotlib 简介
1. 什么是 Matplotlib?为什么使用 Matplotlib?
Matplotlib 是 Python 中最流行的绘图库,它提供了一个完整的 2D 绘图环境,可以创建出具有出版质量的图形。
由 John Hunter 于 2003 年创建,最初的目的是为了复现 MATLAB 的绘图功能。
为什么要使用 Matplotlib?以下是几个主要原因:
- 功能丰富:支持线图、散点图、柱状图、饼图、直方图等多种图表类型
- 高度可定制:几乎每个图形元素都可以自定义
- 广泛集成:与 NumPy、Pandas 和其他科学计算库紧密集成
- 行业标准:在数据科学、机器学习和科学研究中被广泛使用
- 跨平台:支持多种输出格式,包括 PNG、PDF、SVG、EPS 等
Matplotlib 的架构主要分为两种接口:
- pyplot 接口:提供类似 MATLAB 的命令式绘图方式,适合简单快速的绘图
- 面向对象接口:提供更精确的控制和更复杂的图形组合,适合高度自定义的图表
2. 安装与导入
安装 Matplotlib 非常简单,可以使用 pip 或 conda:
# 使用 pip 安装
pip install matplotlib# 使用 conda 安装
conda install matplotlib
在代码中导入 Matplotlib:
# 标准导入方式
import matplotlib.pyplot as plt
import numpy as np # 通常还需要导入 NumPy 进行数据处理
注意:
plt
是导入matplotlib.pyplot
的常用别名,几乎所有 Python 数据科学代码都使用这个约定。
二、基本绘图
Matplotlib 提供了多种基本图表类型。下面我们将学习最常用的三种:折线图、柱状图和饼图。
1. 绘制折线图:plot()
折线图是最基本的图表类型,用于展示数据的变化趋势。使用 plt.plot()
函数可以轻松创建:
import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 准备数据
x = np.linspace(0, 10, 100) # 从0到10创建100个等间距的点
y = np.sin(x) # 计算每个点的正弦值# 绘制折线图
plt.figure(figsize=(8, 4)) # 创建画布,设置大小为 8x4 英寸
plt.plot(x, y) # 绘制折线图
plt.title('正弦函数') # 添加标题
plt.xlabel('x') # 添加 x 轴标签
plt.ylabel('sin(x)') # 添加 y 轴标签
plt.grid(True) # 添加网格线
plt.show() # 显示图形
输出结果:
绘制多条线
你可以在一个图表上绘制多条线,只需多次调用 plot()
函数:
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x), label='sin(x)') # 绘制正弦函数
plt.plot(x, np.cos(x), label='cos(x)') # 绘制余弦函数
plt.plot(x, np.tan(x), label='tan(x)') # 绘制正切函数plt.title('三角函数')
plt.xlabel('x')
plt.ylabel('y')
plt.legend() # 添加图例
plt.grid(True)
plt.show()
自定义线条样式
可以通过格式字符串或关键字参数自定义线条的样式:
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x), 'r-', linewidth=2) # 红色实线
plt.plot(x, np.cos(x), 'b--', linewidth=2) # 蓝色虚线
plt.plot(x, np.sin(x) + np.cos(x), 'g-.', linewidth=2) # 绿色点划线
plt.show()
样式字符串的构成:
- 颜色:‘r’ (红)、‘g’ (绿)、‘b’ (蓝)、‘c’ (青)、‘m’ (洋红)、‘y’ (黄)、‘k’ (黑)、‘w’ (白)
- 线型:‘-’ (实线)、‘–’ (虚线)、‘-.’ (点划线)、‘:’ (点线)
- 标记:‘o’ (圆点)、‘s’ (方块)、‘^’ (三角形)、‘*’ (星号)等
2. 绘制柱状图:bar()
和 barh()
柱状图用于比较不同类别的数据大小,分为垂直柱状图(bar()
)和水平柱状图(barh()
)。
垂直柱状图
import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 准备数据
categories = ['A', 'B', 'C', 'D', 'E']
values = [25, 40, 30, 55, 15]# 创建垂直柱状图
plt.figure(figsize=(8, 6))
plt.bar(categories, values, color='skyblue', edgecolor='navy')
plt.title('各类别数据比较')
plt.xlabel('类别')
plt.ylabel('数值')
plt.show()
水平柱状图
plt.figure(figsize=(8, 6))
plt.barh(categories, values, color='skyblue', edgecolor='navy')
plt.title('各类别数据比较')
plt.xlabel('数值')
plt.ylabel('类别')
plt.show()
分组柱状图
分组柱状图用于比较多个数据集:
# 准备数据
categories = ['A', 'B', 'C', 'D', 'E']
values1 = [25, 40, 30, 55, 15]
values2 = [15, 30, 40, 20, 35]# 设置柱状图位置
x = np.arange(len(categories)) # 类别标签位置
width = 0.35 # 柱子宽度# 创建分组柱状图
plt.figure(figsize=(10, 6))
plt.bar(x - width/2, values1, width, label='组1', color='skyblue')
plt.bar(x + width/2, values2, width, label='组2', color='lightgreen')# 添加标签和图例
plt.title('两组数据比较')
plt.xlabel('类别')
plt.ylabel('数值')
plt.xticks(x, categories) # 替换 x 轴刻度标签
plt.legend()
plt.grid(True, axis='y') # 只显示水平网格线
plt.show()
3. 绘制饼图:pie()
饼图用于显示数据的比例关系,特别适合表示占比或分布情况。
import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 准备数据
labels = ['A', 'B', 'C', 'D', 'E']
sizes = [15, 30, 25, 10, 20] # 各部分大小
explode = (0, 0.1, 0, 0, 0) # 突出显示第二部分
colors = ['gold', 'lightcoral', 'lightskyblue', 'lightgreen', 'lightpink'] # 各部分颜色# 创建饼图
plt.figure(figsize=(8, 8))
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', # 显示百分比格式shadow=True, # 添加阴影startangle=90) # 起始角度
plt.axis('equal') # 确保饼图是圆形的
plt.title('数据占比分布')
plt.show()
输出结果:
饼图的主要参数:
sizes
:各部分的大小explode
:特定部分的突出显示labels
:各部分的标签colors
:各部分的颜色autopct
:显示百分比的格式shadow
:是否添加阴影效果startangle
:起始角度
三、图形美化
默认的 Matplotlib 图形样式较为简单,通过一些美化设置可以让图表更加专业和美观。
1. 添加标题、标签、图例
标题和标签
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))# 添加标题和标签
plt.title('正弦函数图', fontsize=16) # 添加标题,设置字体大小
plt.xlabel('X 轴', fontsize=12) # 添加 x 轴标签
plt.ylabel('Y 轴', fontsize=12) # 添加 y 轴标签# 添加文本注释
plt.text(5, 0.5, 'sin(x) 的最大值是 1', fontsize=12)plt.show()
图例
图例帮助识别图表中的不同数据系列:
plt.figure(figsize=(10, 6))# 绘制多条线并设置标签
plt.plot(x, np.sin(x), 'r-', label='sin(x)')
plt.plot(x, np.cos(x), 'b--', label='cos(x)')
plt.plot(x, np.sin(x) * np.cos(x), 'g-.', label='sin(x)·cos(x)')# 添加图例
plt.legend(loc='best', # 自动选择最佳位置fontsize=12, # 设置字体大小frameon=True, # 显示边框shadow=True) # 添加阴影效果plt.show()
图例位置选项:
'best'
:自动选择最佳位置'upper right'
,'upper left'
,'lower right'
,'lower left'
:四个角'center'
,'center left'
,'center right'
,'lower center'
,'upper center'
:中心和边缘
2. 调整颜色、样式、网格
设置样式
Matplotlib 提供了多种预设样式可供选择:
# 查看可用样式
print(plt.style.available)# 设置样式
plt.style.use('seaborn-v0_8-darkgrid') # 使用 Seaborn 暗网格样式plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))
plt.title('使用 Seaborn 样式的图表')
plt.show()
常用样式包括:‘ggplot’, ‘seaborn’, ‘bmh’, ‘dark_background’, ‘fivethirtyeight’ 等。
设置颜色和透明度
plt.figure(figsize=(10, 6))# 设置颜色和透明度
plt.plot(x, np.sin(x), color='#FF5733', alpha=0.8, linewidth=2)
plt.fill_between(x, np.sin(x), alpha=0.3, color='#FF5733') # 添加填充区域plt.title('带填充区域的正弦函数')
plt.show()
颜色可以通过名称(如 ‘red’)、十六进制代码(如 ‘#FF5733’)或 RGB 元组(如 (1, 0, 0))指定。
添加网格
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))# 添加网格
plt.grid(True, # 显示网格linestyle='--', # 虚线样式alpha=0.7, # 透明度color='gray') # 颜色plt.show()
3. 调整坐标轴
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))# 设置坐标轴范围
plt.xlim(0, 10) # 设置 x 轴范围
plt.ylim(-1.5, 1.5) # 设置 y 轴范围# 设置刻度
plt.xticks(np.arange(0, 11, 2)) # 设置 x 轴刻度
plt.yticks([-1, -0.5, 0, 0.5, 1]) # 设置 y 轴刻度plt.show()
4. 子图布局
使用 subplot
可以在一个图形中创建多个子图:
plt.figure(figsize=(12, 8))# 创建 2x2 布局的子图
plt.subplot(2, 2, 1) # 第一行第一列
plt.plot(x, np.sin(x))
plt.title('sin(x)')plt.subplot(2, 2, 2) # 第一行第二列
plt.plot(x, np.cos(x), 'g-')
plt.title('cos(x)')plt.subplot(2, 2, 3) # 第二行第一列
plt.plot(x, np.sin(x) * np.cos(x), 'r-')
plt.title('sin(x)·cos(x)')plt.subplot(2, 2, 4) # 第二行第二列
plt.plot(x, np.sin(x) + np.cos(x), 'm-')
plt.title('sin(x)+cos(x)')plt.tight_layout() # 自动调整子图参数,使之填充整个图像区域
plt.show()
四、练习:可视化销售数据趋势
现在,让我们应用所学知识,创建一个销售数据可视化案例。
1️⃣准备数据
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib.ticker import StrMethodFormatter# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 生成销售数据
np.random.seed(42) # 设置随机种子,确保结果可重现# 创建月份数据
months = pd.date_range(start='2023-01-01', periods=12, freq='ME')
month_labels = [m.strftime('%Y-%m') for m in months]# 创建三种产品的销售数据
product_A = np.random.randint(100, 200, size=12) * (1 + np.sin(np.linspace(0, 2*np.pi, 12)) * 0.2)
product_B = np.random.randint(150, 250, size=12) * (1 + np.cos(np.linspace(0, 2*np.pi, 12)) * 0.1)
product_C = np.random.randint(80, 180, size=12) * (1 + 0.05 * np.arange(12)) # 线性增长趋势# 创建 DataFrame
sales_data = pd.DataFrame({'月份': month_labels,'产品A': product_A,'产品B': product_B,'产品C': product_C
})# 计算总销售额
sales_data['总销售额'] = sales_data['产品A'] + sales_data['产品B'] + sales_data['产品C']print(sales_data.head())
输出结果:
2️⃣绘制销售趋势图表
# 设置绘图样式
plt.style.use('seaborn-v0_8-whitegrid')# 创建一个大画布,包含多个子图
plt.figure(figsize=(15, 10))# 1. 绘制各产品月度销售趋势折线图
plt.subplot(2, 2, 1)
plt.plot(sales_data['月份'], sales_data['产品A'], 'o-', label='产品A', linewidth=2)
plt.plot(sales_data['月份'], sales_data['产品B'], 's-', label='产品B', linewidth=2)
plt.plot(sales_data['月份'], sales_data['产品C'], '^-', label='产品C', linewidth=2)plt.title('各产品月度销售趋势', fontsize=14)
plt.xlabel('月份', fontsize=12)
plt.ylabel('销售额', fontsize=12)
plt.xticks(rotation=45) # 旋转 x 轴标签,防止重叠
plt.legend()
plt.grid(True)# 2. 绘制总销售额柱状图
plt.subplot(2, 2, 2)
bars = plt.bar(sales_data['月份'], sales_data['总销售额'], color='skyblue', edgecolor='navy')# 为柱状图添加数值标签
for bar in bars:height = bar.get_height()plt.text(bar.get_x() + bar.get_width()/2., height + 5,f'{int(height)}',ha='center', va='bottom', fontsize=9)plt.title('月度总销售额', fontsize=14)
plt.xlabel('月份', fontsize=12)
plt.ylabel('销售额', fontsize=12)
plt.xticks(rotation=45)
plt.gca().yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}')) # 设置 y 轴格式# 3. 绘制每月各产品销售占比(堆叠柱状图)
plt.subplot(2, 2, 3)
bottom = np.zeros(12) # 初始底部位置for product, color in zip(['产品A', '产品B', '产品C'], ['#5DA5DA', '#FAA43A', '#60BD68']):plt.bar(sales_data['月份'], sales_data[product], bottom=bottom, label=product, color=color, alpha=0.8)bottom += sales_data[product] # 更新底部位置plt.title('月度产品销售比例', fontsize=14)
plt.xlabel('月份', fontsize=12)
plt.ylabel('销售额', fontsize=12)
plt.xticks(rotation=45)
plt.legend()# 4. 绘制三种产品总销售额占比(饼图)
plt.subplot(2, 2, 4)
product_totals = [sales_data['产品A'].sum(), sales_data['产品B'].sum(), sales_data['产品C'].sum()]
labels = ['产品A', '产品B', '产品C']
colors = ['#5DA5DA', '#FAA43A', '#60BD68']
explode = (0.05, 0, 0) # 突出显示产品Aplt.pie(product_totals, labels=labels, colors=colors, autopct='%1.1f%%', startangle=90, explode=explode, shadow=True)
plt.axis('equal') # 保证饼图是圆的
plt.title('各产品销售总额占比', fontsize=14)# 调整布局
plt.tight_layout()
plt.savefig('sales_analysis.png', dpi=300, bbox_inches='tight') # 保存图表
plt.show()
输出结果:
3️⃣分析与总结
通过上面的可视化图表,我们可以清晰地看到:
- 销售趋势:折线图展示了各产品每月的销售变化趋势,可以观察到季节性波动和长期趋势。
- 销售规模:柱状图直观地展示了每月的总销售额,便于比较不同月份的销售表现。
- 产品结构:堆叠柱状图展示了每月各产品的销售构成,饼图则展示了全年各产品的销售比例。
这种综合性的可视化方式,可以帮助我们从多个角度分析销售数据,发现潜在的商业机会和挑战。
五、总结与拓展
1. 核心知识点回顾
在本文中,我们学习了:
- `Matplotlib 的基本概念`:包括其架构、用途和导入方式
- `基本图表类型`:如何创建折线图、柱状图和饼图
- `图形美化技巧`:如何添加标题、标签、图例,以及调整颜色、样式和网格
- `实战应用`:如何将多种图表类型组合使用,进行综合性的数据可视化
2. 进阶技巧
如果你想进一步提升 Matplotlib 可视化技能,可以探索以下内容:
- 更多图表类型:如散点图、直方图、箱线图、热力图等
- 3D 绘图:使用
mplot3d
工具包创建三维图表 - 交互式图表:结合
ipywidgets
创建交互式可视化 - 动画:使用
animation
模块创建动态图表 - 与 Pandas 结合:使用 Pandas 的
plot()
方法,简化数据可视化流程
3. 学习资源推荐
- 官方文档:Matplotlib 官方文档
- 图例集:Matplotlib 图例集
- 在线教程:Datacamp、Coursera 上的 Python 数据可视化课程
- 书籍:《Python for Data Analysis》和《Python Data Science Handbook》
在下一篇文章中,我们将探索另一个强大的可视化库 Seaborn,它基于 Matplotlib 构建,提供了更高级的统计图表和更优雅的默认样式。
关键词:Python, Matplotlib, 数据可视化, 绘图, 折线图, 柱状图, 饼图, 图表美化, CSDN Python教程
练习题:
- 尝试结合 Pandas 和 Matplotlib,可视化一个包含多个变量的真实数据集(如气温、股票价格等)。
- 创建一个包含 4 个子图的画布,分别用不同类型的图表展示同一数据集的不同特征。
- 探索 Matplotlib 的颜色映射(colormap)功能,尝试使用不同的颜色方案来增强可视化效果。
希望这篇文章能帮助你掌握 Matplotlib 的基础知识,开始创建引人注目的数据可视化作品,如有问题,欢迎在评论区留言交流!
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
如果你对今天的内容有任何问题,或者想分享你的学习心得,欢迎在评论区留言讨论!