作者:唐叔在学习
专栏:唐叔学python
标签:Python可视化、Matplotlib教程、数据可视化、Python数据分析、机器学习可视化、科研绘图、Python图表、大数据可视化、Python入门、AI可视化
一、Matplotlib是什么?为什么它如此重要?
各位小伙伴们好,我是唐叔!今天咱们来聊聊Python可视化界的"扛把子"——Matplotlib。
Matplotlib 是Python中最基础、最经典的可视化库,由John D. Hunter于2003年创建。它就像是数据科学家的"画笔",能够将枯燥的数据转化为直观的图表。在数据科学、机器学习、科研等领域,Matplotlib几乎是标配工具。
为什么我强烈推荐学习Matplotlib?三个理由:
- 兼容性强:与NumPy、Pandas无缝集成
- 功能全面:从简单折线图到复杂3D图表应有尽有
- 社区强大:遇到问题随时能找到解决方案
import matplotlib.pyplot as plt
import numpy as np
# 最简单的例子
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.title("我的第一个Matplotlib图表")
plt.show()
二、Matplotlib安装与基础配置
2.1 安装Matplotlib
pip install matplotlib
# 或者使用conda
conda install matplotlib
2.2 基础配置
唐叔小技巧:在Jupyter Notebook中使用以下魔法命令,让图表显示更美观:
%matplotlib inline
plt.style.use('seaborn') # 使用更现代的样式
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
2.3 基本代码样式
下述是基本的代码样式:
import numpy as np
import matplotlib.pyplot as plt
# 模拟数据
x = np.arange(0, 5, 0.1)
y = np.sin(x)
# plt.具体表(x, y [,other])
plt.plot(x, y)
# 展示图表
plt.show()
三、12种必学图表类型详解
3.1 折线图 - 趋势分析利器
import matplotlib.pyplot as plt
# 股票价格趋势示例
days = [1, 2, 3, 4, 5]
price = [23.5, 24.1, 23.9, 25.2, 26.0]
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
plt.plot(days, price, marker='o', linestyle='--', color='r')
plt.xlabel("日期")
plt.ylabel("价格(元)")
plt.title("某股票五日价格趋势")
plt.grid(True)
plt.show()
3.2 柱状图 - 对比分析神器
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 各大城市平均薪资对比
cities = ['北京', '上海', '深圳', '广州', '杭州']
salaries = [25000, 23000, 22000, 18000, 20000]
plt.bar(cities, salaries, color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd'])
plt.title("2023年各大城市IT平均薪资")
plt.ylabel("薪资(元)")
plt.show()
3.3 散点图 - 相关性分析法宝
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 身高体重相关性分析
np.random.seed(42)
height = np.random.normal(170, 10, 100)
weight = height * 0.6 + np.random.normal(0, 5, 100)
plt.scatter(height, weight, alpha=0.6, edgecolors='w')
plt.xlabel("身高(cm)")
plt.ylabel("体重(kg)")
plt.title("身高体重相关性分析")
plt.show()
3.4 饼图 - 占比分析必备
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 手机市场份额
brands = ['苹果', '华为', '小米', 'OPPO', 'vivo', '其他']
share = [25, 20, 18, 15, 12, 10]
explode = (0.1, 0, 0, 0, 0, 0) # 突出显示第一块
plt.pie(share, explode=explode, labels=brands, autopct='%1.1f%%', shadow=True)
plt.title("2023年中国智能手机市场份额")
plt.show()
3.5 直方图 - 分布分析专家
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 学生成绩分布
scores = np.random.normal(75, 12, 1000)
plt.hist(scores, bins=20, edgecolor='black')
plt.xlabel("分数")
plt.ylabel("人数")
plt.title("高三(1)班模拟考成绩分布")
plt.show()
3.6 箱线图 - 异常值检测高手
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 各地区房价对比
data = [np.random.normal(50000, 10000, 100),
np.random.normal(60000, 8000, 100),
np.random.normal(45000, 12000, 100)]
plt.boxplot(data, labels=['朝阳区', '海淀区', '丰台区'])
plt.ylabel("房价(元/平米)")
plt.title("北京市各区房价分布")
plt.show()
3.7 热力图 - 矩阵数据可视化
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 相关系数矩阵
data = np.random.rand(10, 10)
plt.imshow(data, cmap='hot', interpolation='nearest')
plt.colorbar()
plt.title("相关系数热力图")
plt.show()
3.8 面积图 - 累积效果展示
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 各季度销售额累积
x = ['Q1', 'Q2', 'Q3', 'Q4']
y1 = [120, 140, 160, 180] # 产品A
y2 = [80, 100, 120, 150] # 产品B
plt.stackplot(x, y1, y2, labels=['产品A', '产品B'])
plt.legend(loc='upper left')
plt.title("2023年各季度销售额累积")
plt.show()
3.9 极坐标图 - 周期性数据展示
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 雷达图展示技能点
categories = ['Python', 'SQL', '机器学习', '统计学', '沟通能力']
values = [90, 85, 80, 75, 70]
angles = np.linspace(0, 2*np.pi, len(categories), endpoint=False)
values = np.concatenate((values,[values[0]]))
angles = np.concatenate((angles,[angles[0]]))
plt.polar(angles, values, marker='o')
plt.fill(angles, values, alpha=0.25)
plt.thetagrids(angles[:-1] * 180/np.pi, categories)
plt.title("数据科学家技能雷达图")
plt.show()
3.10 3D图表 - 立体数据展示
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 3D散点图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = np.random.normal(0, 1, 100)
y = np.random.normal(0, 1, 100)
z = np.random.normal(0, 1, 100)
ax.scatter(x, y, z, c='r', marker='o')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')
plt.title("3D散点图示例")
plt.show()
3.11 等高线图 - 二维标量场可视化
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 函数可视化
def f(x, y):
return np.sin(np.sqrt(x**2 + y**2))
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
plt.contourf(X, Y, Z, 20, cmap='RdGy')
plt.colorbar()
plt.title("函数$sin(√(x^2+y^2))$的等高线图")
plt.show()
3.12 组合图表 - 复杂可视化
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 组合折线图和柱状图
fig, ax1 = plt.subplots()
x = ['1月', '2月', '3月', '4月', '5月']
sales = [120, 150, 130, 200, 180]
profit_rate = [0.15, 0.18, 0.12, 0.20, 0.16]
ax1.bar(x, sales, color='b', alpha=0.6)
ax1.set_xlabel('月份')
ax1.set_ylabel('销售额(万元)', color='b')
ax1.tick_params(axis='y', labelcolor='b')
ax2 = ax1.twinx()
ax2.plot(x, profit_rate, 'r-o')
ax2.set_ylabel('利润率', color='r')
ax2.tick_params(axis='y', labelcolor='r')
plt.title("2023年1-5月销售情况分析")
plt.show()
四、Matplotlib高级技巧
4.1 子图布局
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 2x2子图布局
fig, axs = plt.subplots(2, 2, figsize=(10, 8))
axs[0, 0].plot(np.random.rand(10))
axs[0, 0].set_title('随机折线图')
axs[0, 1].scatter(np.random.rand(10), np.random.rand(10))
axs[0, 1].set_title('随机散点图')
axs[1, 0].bar(['A', 'B', 'C'], [3, 7, 2])
axs[1, 0].set_title('简单柱状图')
axs[1, 1].pie([30, 20, 50], labels=['X', 'Y', 'Z'])
axs[1, 1].set_title('饼图示例')
plt.tight_layout()
plt.show()
4.2 动画制作
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 正弦波动画
fig, ax = plt.subplots()
x = np.linspace(0, 2*np.pi, 100)
line, = ax.plot(x, np.sin(x))
def update(frame):
line.set_ydata(np.sin(x + frame/10))
return line,
ani = FuncAnimation(fig, update, frames=100, interval=50)
plt.title("动态正弦波")
plt.show()
4.3 自定义样式
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 使用自定义样式
plt.style.use('ggplot')
x = np.arange(10)
plt.plot(x, x**2, 'b-', label='平方')
plt.plot(x, x**3, 'r--', label='立方')
plt.legend()
plt.title("自定义样式示例")
cParams['axes.unicode_minus'] = False # 解决负号显示问题
# 使用自定义样式
plt.style.use('ggplot')
x = np.arange(10)
plt.plot(x, x**2, 'b-', label='平方')
plt.plot(x, x**3, 'r--', label='立方')
plt.legend()
plt.title("自定义样式示例")
plt.show()
五、总结与学习建议
通过本文,唐叔带你系统学习了Matplotlib的12种核心图表类型和3个高级技巧。记住:
- 基础图表是根本,折线图、柱状图、散点图必须熟练掌握
- 高级图表如3D图、热力图能让你在特定场景下表现更专业
- 组合使用各种图表类型能产生更丰富的数据洞察
学习建议:
- 先掌握基础图表,再逐步学习高级功能
- 多动手实践,从简单的数据集开始
- 参考官方文档和优秀案例(如Seaborn的源码)
Matplotlib虽然学习曲线略陡峭,但一旦掌握,你就能随心所欲地让数据"说话"。记住唐叔的话:“数据可视化不是目的,而是发现数据价值的手段。”
最后送大家一个学习福利:关注唐叔的CSDN账号,回复"Matplotlib"获取本文所有源码和更多实战案例!
往期Python文章推荐
✅ Tkinter - Python图形界面开发指南
✅ Pandas - Python爬虫数据处理分析神器
✅ Pandas - JSON格式数据操作实践
✅ 告别Python环境依赖!用PyInstaller打包EXE的终极指南