数据可视化——Matpoltlib库的使用

Matplotlib 是一个 Python 的 2D 绘图库,提供了一种绘制可视化图形的简单而有效的方式。它可以创建各种类型的图表,包括线图、散点图、直方图、饼图等,使用户能够以可视化的方式呈现数据。Matplotlib 的主要作用是提供一个灵活、可定制的工具集,用于创建高质量的图形。它使得数据分析、数据可视化、科学研究等领域的用户能够以直观的方式探索数据、观察数据之间的关系,并向他人有效传达数据和分析结果。

一、Matplotlib库概述

Matplotlib-Examples教程大全

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()

三、Matplotlib进阶

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()

3.5 子图合成

import numpy as np
from matplotlib import pyplot as plt
t = np.linspace(-np.pi, np.pi, 1024)
fig, (ax0, ax1, ax2) = plt.subplots(ncols =3)
ax0.plot(np.sin(2 * t), np.cos(0.5 * t), c = 'c')
ax1.plot(np.cos(3 * t), np.sin(t), c = 'c')
ax2.plot(np.cos(3 * t), np.sin(2 * t), c = 'c')
plt.tight_layout()
plt.show()

import numpy as np
from matplotlib import pyplot as plt
def get_radius(t, params):
    m, n_1, n_2, n_3 = params
    u = (m * t) / 4
    return (np.fabs(np.cos(u)) ** n_2 + np.fabs(np.sin(u)) ** n_3) ** (-1. / n_1)
grid_size = (3, 4)
t = np.linspace(0, 2 * np.pi, 1024)
for i in range(grid_size[0]):
    for j in range(grid_size[1]):
        params = np.random.randint(1, 20 +1, size = 4)
        r = get_radius(t, params)
        plt.subplot2grid(grid_size, (i, j), rowspan=1, colspan=1)
        plt.plot(r * np.cos(t), r * np.sin(t), c = 'c')
        plt.title('%d, %d, %d, %d' % tuple(params), fontsize = 'small')
plt.suptitle("Example of plt.suptitle")
plt.tight_layout()
plt.show()

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 1000)
y_1, y_2 = np.sinc(x), np.cos(x)
plt.figure(figsize=(10.24, 2.56))
plt.plot(x, y_1, c='c', lw = 1.25)
plt.plot(x, y_2, c='m', lw = 1.25)
plt.show()

3.6 直方图+散点图

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(2000)
y = np.random.randn(2000)

sns.jointplot(x=x, y=y)
# sns.jointplot(x=x, y=y, kind="reg") # hist上面添加一条回归线。 下图左
# sns.jointplot(x=x, y=y, kind="kde")	# 以概率密度图的形式呈现。 下图右
plt.show()

3.7 多变量联合分布图

import numpy as np  
import pandas as pd  
import matplotlib.pyplot as plt  
import seaborn as sns  # 导入seaborn库  
from sklearn import datasets  
  
# 从sklearn中获取鸢尾花数据集,并转换为DataFrame  
iris = datasets.load_iris()  
dataset = pd.DataFrame(iris.data, columns=iris.feature_names)  
# 转换目标值为鸢尾花品种名称  
dataset["species"] = pd.Categorical.from_codes(iris.target, iris.target_names)  
  
# 创建图形  
plt.figure(figsize=(10, 8), dpi=80)  
  
# 绘制成对关系图,设置hue为品种  
sns.pairplot(dataset, kind="reg", hue="species")  
  
# 显示图形  
plt.show()

3.8 小提琴图

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 设置样本数量为10^4
N = 10 ** 4

# 生成标准正态分布的随机数
x = np.random.normal(size=N)

# 创建一个3x1的子图布局,并设置整体大小以及共享x轴
fig, ax = plt.subplots(3, 1, figsize=(15, 8), sharex=True)

# 在第一个子图上绘制直方图和核密度估计
sns.histplot(x, ax=ax[0], kde=True, bins=30)  # 使用histplot代替distplot,并设置直方图的柱子数量
ax[0].set_title('Histogram + KDE')  # 设置子图标题

# 在第二个子图上绘制箱线图
sns.boxplot(x=x, ax=ax[1])
ax[1].set_title('Boxplot')  # 设置子图标题

# 在第三个子图上绘制小提琴图
sns.violinplot(x=x, ax=ax[2], scale='width')
ax[2].set_title('Violin plot')  # 设置子图标题

# 设置整个图的标题
fig.suptitle('Standard Normal Distribution', fontsize=16)

# 调整子图之间的间距
plt.tight_layout()

# 显示图形
plt.show()

总结

Matplotlib 作为 Python 中最受欢迎的绘图库之一,其发展趋势主要体现在以下几个方面:性能优化:随着数据量的增加和计算需求的提高,Matplotlib 不断进行性能优化,使得绘图过程更加高效。交互性增强:近年来,Matplotlib 不断增强交互性,支持用户与图形进行交互操作,如缩放、平移、选择等,提升用户体验。美化样式:Matplotlib 社区不断开发新的样式库和美化工具,使用户能够轻松地创建出具有吸引力的图形。扩展功能:除了基本的绘图功能外,Matplotlib 还在不断扩展新的功能模块,如三维绘图、地理数据可视化等,以满足不同领域的需求。整合其他库:Matplotlib 与其他 Python 库的整合也在不断加强,如与 Pandas、NumPy、SciPy 等科学计算库的结合,使得数据处理和可视化更加便捷。综上Matplotlib 作为 Python 中功能强大、灵活易用的绘图库,将会继续保持其在数据可视化领域的重要地位,并随着技术的发展不断完善和扩展其功能。

参考文献

  1. matplotlib绘制直方图,饼图,散点图,气泡图,箱型图,雷达图
  2. Matplotlib数据可视化基础pandas统计分析基础
  3. python+matplotlib绘制具有多个子图的图表
posted @   郝hai  阅读(387)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示