Matplotlib是Python中最著名的数据可视化库,它提供了丰富的绘图功能,可以帮助我们将数据转化为直观的图表。本文将介绍Matplotlib的基础图表绘制方法以及多图展示技巧,非常适合初学者学习。
在绘制图表时,为图表添加适当的轴标签和标题是非常重要的,它能让读者更好地理解图表所表达的信息。
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("正弦函数曲线") # 图表标题
plt.xlabel("X轴") # X轴标签
plt.ylabel("Y轴") # Y轴标签
plt.show()
说明:
title()
函数用于设置图表标题
xlabel()
和 ylabel()
分别用于设置X轴和Y轴的标签
这些函数应该在绘图函数(如plot()
)之后调用
默认情况下,Matplotlib可能无法正确显示中文字符,会出现方框或乱码。解决方法有以下几种:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
plt.title("显示中文标题")
plt.show()
plt.title("显示中文标题", fontproperties="SimHei")
plt.show()
常用中文字体:
Windows: SimHei(黑体), Microsoft YaHei(微软雅黑)
Mac: PingFang SC(苹方), Hiragino Sans GB(冬青黑体)
Linux: Noto Sans CJK SC
网格线可以帮助我们更准确地读取图表中的数据值。
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.title("带网格线的正弦曲线")
plt.grid(True) # 显示网格线
# 可以自定义网格线样式
# plt.grid(True, linestyle='--', alpha=0.5)
plt.show()
参数说明:
linestyle
: 网格线样式,如'-', '--', '-.', ':'
alpha
: 透明度(0-1)
color
: 网格线颜色
当我们需要比较多个相关数据集时,将多个图表放在同一画布上是非常有用的。
subplot()
方法通过指定行数、列数和当前子图索引来创建子图。
# 创建2行1列的子图,当前操作第1个子图
plt.subplot(2, 1, 1) # (行, 列, 索引)
plt.plot(x, np.sin(x))
plt.title("正弦函数")
# 切换到第2个子图
plt.subplot(2, 1, 2)
plt.plot(x, np.cos(x))
plt.title("余弦函数")
plt.tight_layout() # 自动调整子图间距
plt.show()
subplots()
方法更现代,可以一次性创建多个子图并返回子图对象的数组。
fig, axes = plt.subplots(2, 2, figsize=(10, 8)) # 2行2列
# 含义
# figsize 参数接受一个包含两个数字的元组 (宽度, 高度)
# 第一个数字 10 表示图形的宽度为10英寸
# 第二个数字 8 表示图形的高度为8英寸
# 绘制第1个子图
axes[0, 0].plot(x, np.sin(x))
axes[0, 0].set_title("正弦函数")
# 绘制第2个子图
axes[0, 1].plot(x, np.cos(x))
axes[0, 1].set_title("余弦函数")
# 绘制第3个子图
axes[1, 0].plot(x, np.tan(x))
axes[1, 0].set_title("正切函数")
axes[1, 0].set_ylim(-5, 5) # 限制Y轴范围
# 绘制第4个子图
axes[1, 1].plot(x, np.exp(x))
axes[1, 1].set_title("指数函数")
plt.tight_layout()
plt.show()
优点:
代码结构更清晰
方便对子图进行统一操作
可以轻松调整整个图形的尺寸
散点图用于展示两个变量之间的关系,适合观察数据的分布模式。
# 生成随机数据
np.random.seed(0)
x = np.random.randn(100)
y = np.random.randn(100)
colors = np.random.rand(100)
sizes = 1000 * np.random.rand(100)
plt.scatter(x, y, c=colors, s=sizes, alpha=0.7, cmap='viridis')
plt.colorbar() # 显示颜色条
plt.title("随机散点图")
plt.xlabel("X值")
plt.ylabel("Y值")
plt.show()
参数说明:
c
: 点颜色,可以是单一颜色或颜色序列
s
: 点大小
alpha
: 透明度
cmap
: 颜色映射
柱形图适合比较不同类别之间的数值大小。
labels = ['苹果', '香蕉', '橙子', '梨']
values = [25, 40, 30, 20]
plt.bar(labels, values, color=['red', 'yellow', 'orange', 'green'])
plt.title("水果销量")
plt.ylabel("销量(kg)")
plt.show()
变体:分组柱形图
labels = ['第一季度', '第二季度', '第三季度', '第四季度']
men_means = [20, 35, 30, 35]
women_means = [25, 32, 34, 20]
x = np.arange(len(labels))
width = 0.35
fig, ax = plt.subplots()
rects1 = ax.bar(x - width/2, men_means, width, label='男性')
rects2 = ax.bar(x + width/2, women_means, width, label='女性')
ax.set_ylabel('销量')
ax.set_title('季度销量按性别分组')
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()
plt.show()
饼图适合展示各部分占整体的比例。
labels = ['娱乐', '餐饮', '交通', '购物', '其他']
sizes = [15, 30, 20, 25, 10]
explode = (0, 0.1, 0, 0, 0) # 突出"餐饮"部分
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=True, startangle=90)
plt.axis('equal') # 确保饼图是圆形
plt.title("月度支出比例")
plt.show()
参数说明:
explode
: 突出显示某部分
autopct
: 显示百分比格式
shadow
: 添加阴影效果
startangle
: 起始角度
直方图用于展示数据的分布情况。
# 生成正态分布数据
data = np.random.randn(1000)
plt.hist(data, bins=30, density=True, alpha=0.7,
histtype='stepfilled', color='steelblue', edgecolor='none')
plt.title("数据分布直方图")
plt.xlabel("值")
plt.ylabel("频率")
plt.show()
参数说明:
bins
: 柱子数量
density
: 是否显示为概率密度
alpha
: 透明度
histtype
: 直方图类型
本文介绍了Matplotlib中常用的图表类型和绘制方法,包括:
基础图表元素:轴标签、标题、网格线
中文显示问题的解决方案
多图绘制方法:subplot()和subplots()
常用图表类型:散点图、柱形图、饼图、直方图
掌握这些基础图表绘制方法后,你已经可以完成大部分的数据可视化任务。在实际应用中,可以根据数据特点选择合适的图表类型,并通过调整各种参数使图表更加美观和易读。
学习建议:
多动手实践,尝试修改示例代码中的参数
查阅Matplotlib官方文档了解更多参数和功能
学习如何自定义图表样式,如颜色、线型、标记等
希望这篇教程能帮助你快速入门Matplotlib数据可视化!