Matplotlib 是一个 Python 的 2D 绘图库,提供了一种绘制可视化图形的简单而有效的方式。它可以创建各种类型的图表,包括线图、散点图、直方图、饼图等,使用户能够以可视化的方式呈现数据。Matplotlib 的主要作用是提供一个灵活、可定制的工具集,用于创建高质量的图形。它使得数据分析、数据可视化、科学研究等领域的用户能够以直观的方式探索数据、观察数据之间的关系,并向他人有效传达数据和分析结果。
一、Matplotlib库概述
1.1 Matplotlib库的应用
科学研究:在科学研究中,Matplotlib 可用于绘制实验数据、模拟结果、统计分析等,帮助研究人员更好地理解数据和发现规律。
数据分析:数据分析师和数据科学家可以使用 Matplotlib 将复杂的数据转化为易于理解的可视化图形,从而更好地探索数据并提取信息。
工程技术:在工程领域,Matplotlib 可用于绘制工程图、曲线图、三维图等,帮助工程师分析数据、设计系统并进行可视化展示。
教育:Matplotlib 可作为教学工具,用于向学生展示各种数学概念、科学原理和统计方法,使学习过程更加生动有趣。
金融:金融领域常用 Matplotlib 来绘制股票走势图、收益曲线等,帮助分析市场走势和制定投资策略。
1.2 Matplotlib库的优缺点
优点:
功能强大:Matplotlib 提供了丰富的绘图功能,用户可以创建各种类型的图表,并对其进行高度定制。
灵活性:Matplotlib 允许用户通过简单的命令和参数调整来控制图形的外观和布局,满足不同需求。
跨平台性:Matplotlib 支持在各种操作系统上运行,包括 Windows、Linux 和 macOS。
社区支持:Matplotlib 拥有庞大的用户社区,用户可以轻松获取支持和解决问题。
缺点:
绘图代码复杂:有时候,绘制复杂图形所需的代码可能相对较长,不够简洁。
默认样式较简单:Matplotlib 的默认样式可能不够吸引人,需要用户进行样式调整以获得更美观的图形。
二、Matplotlib库的作图示例
2.1 饼图Pie
import numpy as np
import matplotlib.pyplot as plt
data = np.array([20, 50, 10, 15, 30, 55])
pie_labels = np.array(['A', 'B', 'C', 'D', 'E', 'F'])
# 绘制圆环图 : 外圆半径为 1.5, 楔形宽度为 0.7
plt.pie(data, radius=1.5, wedgeprops={'width': 0.8}, labels=pie_labels,
autopct='%3.1f%%', pctdistance=0.75)
plt.show()
2.2 直方图Hist
import matplotlib.pyplot as plt
import numpy as np
# 10000 个随机数
random_x = np.random.randn(10000)
# 绘制包含 25 个矩形条的直方图
plt.hist(random_x, bins=25)
plt.show()
2.3 箱线图box
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
data_2018 = np.array([5200, 5254.5, 5283.4, 5107.8, 5443.3, 5550.6,
6400.2, 6404.9, 5483.1, 5330.2, 5543, 6199.9])
data_2017 = np.array([4605.2, 4710.3, 5168.9, 4767.2, 4947, 5203,
6047.4, 5945.5, 5219.6, 5038.1, 5196.3, 5698.6])
# 绘制箱形图
plt.boxplot([data_2018, data_2017], labels=('2018 年 ', '2017 年 '),
meanline=True, widths=0.5, vert=True, patch_artist=True)
plt.show()
2.4 雷达图radar
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
dim_num = 6
data = np.array([[0.40, 0.32, 0.35, 0.30, 0.30, 0.88],
[0.85, 0.35, 0.30, 0.40, 0.40, 0.30],
[0.43, 0.89, 0.30, 0.28, 0.22, 0.30],
[0.30, 0.25, 0.48, 0.85, 0.45, 0.40],
[0.20, 0.38, 0.87, 0.45, 0.32, 0.28],
[0.34, 0.31, 0.38, 0.40, 0.92, 0.28]])
angles = np.linspace(0, 2 * np.pi, dim_num, endpoint=False)
angles = np.concatenate((angles, [angles[0]]))
data = np.concatenate((data, [data[0]]))
# 维度标签
radar_labels = [' 研究型 (I)', ' 艺术型 (A)', ' 社会型 (S)',
'企业型 (E)', ' 传统型 (C)', ' 现实型 (R)']
radar_labels = np.concatenate((radar_labels, [radar_labels[0]]))
# 绘制雷达图
plt.polar(angles, data)
# 设置极坐标的标签
plt.thetagrids(angles * 180/np.pi, labels=radar_labels)
# 填充多边形
plt.fill(angles, data, alpha=0.25)
plt.show()
三、Matplotkib库的进阶
3.1 多重直方图
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
data1 = np.random.normal(0, 1, 10000)
data2 = np.random.normal(3, 1.5, 10000)
# 创建画布,并设置大小和背景颜色
fig, ax = plt.subplots(figsize=(8, 6), facecolor='white')
# 绘制两个直方图
n1, bins1, patches1 = ax.hist(data1, bins=50, density=True, alpha=0.5, color='blue')
n2, bins2, patches2 = ax.hist(data2, bins=50, density=True, alpha=0.5, color='green')
# 设置坐标轴范围和标签
ax.set_xlim([-8, 12])
ax.set_xlabel('Value')
ax.set_ylabel('Frequency')
# 添加标题和图例
ax.set_title('Normal Distribution Histogram Comparison')
ax.legend(['Data 1', 'Data 2'])
# 显示图形
plt.show()
3.2 加正态分布的直方图
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm
# 生成随机数据
np.random.seed(42)
data = np.random.randn(1000)
# 创建画布并绘制直方图
fig, ax = plt.subplots(figsize=(8, 5))
n, bins, patches = ax.hist(data, bins=30, density=True, alpha=0.7)
# 计算均值和标准差
mu, std = np.mean(data), np.std(data)
# 添加均值线和注释
ax.vlines(mu, 0, 1.0, colors='r', linestyles='--', label=r'$\mu$')
ax.annotate(r'$\mu={:.2f}$'.format(mu), xy=(mu, 0.25), xytext=(mu + 1, 0.35), fontsize=12, color='r')
# 绘制正态分布曲线
x = np.linspace(min(bins), max(bins), 100)
p = norm.pdf(x, mu, std)
ax.plot(x, p, 'k', linewidth=2, label='Normal distribution')
# 添加图例、标题和标签
ax.legend(loc='best', frameon=False)
ax.set_title('Histogram of a Random Dataset')
ax.set_xlabel('Value')
ax.set_ylabel('Frequency')
plt.show()
3.3 折线图
import matplotlib.pyplot as plt
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# 赛程和得分数据
game = ['1-G1', '1-G2', '1-G3', '1-G4', '1-G5', '2-G1', '2-G2', '2-G3', '2-G4', '2-G5', '3-G1', '3-G2', '3-G3',
'3-G4', '3-G5', '总决赛-G1', '总决赛-G2', '总决赛-G3', '总决赛-G4', '总决赛-G5', '总决赛-G6']
scores = [23, 10, 38, 30, 36, 20, 28, 36, 16, 29, 15, 26, 30, 26, 38, 34, 33, 25, 28, 40, 28]
# 绘图
plt.figure(figsize=(20, 10), dpi=100)
plt.plot(game, scores, c='red', marker='o', linestyle='-')
plt.scatter(game, scores, c='red', marker='o')
y_ticks = range(50)
plt.yticks(y_ticks[::5])
plt.grid(True, linestyle='--', alpha=0.5)
plt.xlabel("赛程", fontdict={'size': 16})
plt.ylabel("得分", fontdict={'size': 16})
plt.title("NBA2020季后赛詹姆斯得分", fontdict={'size': 20})
plt.xticks(rotation=45) # 旋转x轴刻度文字,以避免文字重叠
plt.tight_layout() # 自动调整子图参数,使之填充整个图像区域
plt.show()
3.4 多幅图
import numpy as np
import matplotlib.pyplot as plt
# 生成随机数据
np.random.seed(19680801)
x = np.random.rand(10)
y = np.random.rand(10)
z = np.sqrt(x**2 + y**2)
# 绘制散点图
plt.figure(figsize=(10, 12))
plt.subplot(321)
plt.scatter(x, y, s=80, c=z, marker=">")
plt.title("Marker: '>'")
plt.subplot(322)
plt.scatter(x, y, s=80, c=z, marker=(5, 0))
plt.title("Marker: 'pentagon'")
verts = np.array([[-1, -1], [1, -1], [1, 1], [-1, -1]])
plt.subplot(323)
plt.scatter(x, y, s=80, c=z, marker=verts)
plt.title("Marker: 'verts'")
plt.subplot(324)
plt.scatter(x, y, s=80, c=z, marker=(5, 1))
plt.title("Marker: 'pentagon' rotated")
plt.subplot(325)
plt.scatter(x, y, s=80, c=z, marker='+')
plt.title("Marker: '+'")
plt.subplot(326)
plt.scatter(x, y, s=80, c=z, marker=(5, 2))
plt.title("Marker: 'star'")
plt.tight_layout()
plt.show()
总结
Matplotlib 作为 Python 中最受欢迎的绘图库之一,其发展趋势主要体现在以下几个方面:性能优化:随着数据量的增加和计算需求的提高,Matplotlib 不断进行性能优化,使得绘图过程更加高效。交互性增强:近年来,Matplotlib 不断增强交互性,支持用户与图形进行交互操作,如缩放、平移、选择等,提升用户体验。美化样式:Matplotlib 社区不断开发新的样式库和美化工具,使用户能够轻松地创建出具有吸引力的图形。扩展功能:除了基本的绘图功能外,Matplotlib 还在不断扩展新的功能模块,如三维绘图、地理数据可视化等,以满足不同领域的需求。整合其他库:Matplotlib 与其他 Python 库的整合也在不断加强,如与 Pandas、NumPy、SciPy 等科学计算库的结合,使得数据处理和可视化更加便捷。综上Matplotlib 作为 Python 中功能强大、灵活易用的绘图库,将会继续保持其在数据可视化领域的重要地位,并随着技术的发展不断完善和扩展其功能。