> 技术文档 > Python可视化与交互-matplotlib库

Python可视化与交互-matplotlib库


Python可视化与交互-matplotlib库

  • Python可视化与交互-matplotlib库
    • matplotlib库介绍
    • 绘图基本逻辑
    • 绘制方式
      • 散点图
      • 柱状图
      • 直方图
    • 多子图绘制
    • 二维数据绘制
    • 其他用法

Python可视化与交互-matplotlib库

matplotlib库介绍

matplotlib库是一个非常实用的库,与numpypandas库并称为三大顶级Python库。它可以将matlab中的相当一部分绘图功能迁移到python中,同时,也可以满足一定的交互需求,非常适合可视化的需求。

绘图基本逻辑

先上示例:

import matplotlib.pyplot as pltimport numpy as np# 画图基本逻辑## 准备数据x = np.linspace(0, 10, 100)y = np.sin(x)## 创建画布和容器fig, ax = plt.subplots()## 绘制图形ax.plot(x, y)# 自定义图形ax.set_title(\'Sine Wave\') # 设置标题ax.set_xlabel(\'x\') # 设置横坐标标签ax.set_ylabel(\'sin(x)\') # 设置纵坐标标签ax.grid(True)  # 显示网格# 显示图形plt.show()

该程序运行出来的图如下:
Python可视化与交互-matplotlib库

该实例中,整个绘图流程分为了准备数据创建画布绘制图形图形编辑这几个部分。

首先第一部分,准备数据。本示例中利用numpy库创建了一组正弦函数数据,在实际应用中,更多的是从文件中读取数据。

第二部分创建画布,在matplotlib库中,通常把绘制图形分为局部整体两个部分,这是为了满足多图绘制的需求。因为在绘制数据可视化图形中,通常需要绘制譬如多行多列的图形,因此该库中将绘图整体称之为Figure,将每一个绘制的图形称之为Axes,不过需要指明,该单词虽然意为“坐标轴”,但是其功能更贴切于一个容器,表述每一个子图的绘制。在本示例中,由于只进行了单图的绘制,因此,后续绘制只使用了Axes的实例对象ax

第三部分绘制图形,根据提供的数据,选择不同的绘制方式和表现方式,这也是绘制的核心区域。

最后一部分,图形编辑,可以完善图形的相关信息,比如图名、坐标轴名、网格、图例等。

一般处于调试需求,会将最后的图形输出并显示,即plt.show

绘制方式

上图中我们展示了折线图的画法,在matplotlib库中,针对不同数据和表现形式有不同的绘制方式。这里做简单列举。

散点图

x = np.random.rand(100)y = np.random.rand(100)fig, ax = plt.subplots()ax.scatter(x, y)ax.set_title(\"Scatter\")ax.set_xlabel(\"X\")ax.set_ylabel(\"Y\")ax.grid(True)

展示效果为:

Python可视化与交互-matplotlib库

柱状图

# 柱状图categories = [\'A\', \'B\', \'C\', \'D\', \'E\', \'F\']values = [79, 68, 89, 94, 54, 77]fig, ax = plt.subplots()ax.bar(categories, values)ax.set_title(\"Bar\")ax.set_xlabel(\"Student\")ax.set_ylabel(\"Scores\")plt.show()

展示效果为:

Python可视化与交互-matplotlib库

直方图

# 直方图data = np.random.randn(1000)fig, ax = plt.subplots()ax.hist(data, bins = 100, color = \"green\", alpha = 0.75)ax.set_title(\"Histogram\")ax.set_xlabel(\"Value\")ax.set_ylabel(\"Frequency\")ax.grid(True)plt.show()

展示效果为:

Python可视化与交互-matplotlib库

多子图绘制

上面提及,matplotlib库允许多子图绘制,比如对于一种数据我们可能想要多种表达方式,而这种表达方式不适合放在单图中表示的时候,就需要这种表达。我们可以在subplot()函数中添加参数,以实现这种绘制方式。

# 多子图绘制x = np.linspace(0, 10, 100)y1 = np.sin(x)y2 = np.cos(x)fig, axs = plt.subplots(1, 2, figsize=(10, 8))axs[0].plot(x, y1)axs[0].set_title(\'sin(x)\')axs[0].set_xlabel(\'x\')axs[0].set_ylabel(\'sin(x)\')axs[0].grid(True)axs[1].plot(x, y2)axs[1].set_title(\'cos(x)\')axs[1].set_xlabel(\'x\')axs[1].set_ylabel(\'cos(x)\')axs[1].grid(True)fig.suptitle(\'sin(x) VS. cos(x)\', fontsize = 18)plt.show()

展示效果为:

Python可视化与交互-matplotlib库

本示例中,将正弦函数和余弦函数绘制在同一区域中,可以更好地满足特定情况下的绘制需求。同时,该示例也更好的体现出了FigureAxes的区别。

二维数据绘制

在一些可视化需求中,往往不是简单的数字数据绘制,而是会出现一些二维数据如.grd格式的文件可视化。这里利用GMT工具绘制的.grd文件作为原始数据,通过matplotlib库进行可视化需求,数据格式为netCDF-4。

原图如下:
Python可视化与交互-matplotlib库

代码如下:

import matplotlib.pyplot as pltfrom netCDF4 import Dataset## 准备数据file_path = \"C:/Users/hang/Downloads/test.grd\"nc = Dataset(file_path, \'r\')lon = nc.variables[\'lon\'][:]lat = nc.variables[\'lat\'][:]z = nc.variables[\'z\'][:]nc.close()## 创建画布和容器fig, ax = plt.subplots(figsize = (10, 8))## 图形绘制## pcolormesh是一个用于绘制二维网格数据的函数,能够将数值映射为颜色mesh = ax.pcolormesh(lon, lat, z, cmap = \'jet\', shading = \'auto\')## 图形编辑cbar = fig.colorbar(mesh, ax = ax)cbar.set_label(\'Height\', fontsize = 14)ax.set_xlabel(\'Longitude\')ax.set_ylabel(\'Latitude\')ax.grid(True)plt.show()

同样是几行数据,按照相同的逻辑,即可进行该文件的可视化:
Python可视化与交互-matplotlib库

其他用法

matplotlib库提供了相当丰富的可视化工具,同时,也提供了一些有关交互可视化的工具,这部分将于后续单独介绍。