Python中Matplotlib库的使用(一)——安装与基本使用指南

Python中Matplotlib库的使用

安装

  • 使用pycharm:左上角文件——设置——项目——python解释器——点击+号搜索matplotlib软件包点击安装。

    在这里插入图片描述

  • 或者新建终端,输入以下命令安装。

    pip install matplotlib
    
  • 或者用conda命令安装:

    conda install -c conda-forge matplotlib
    

安装成功后,绘制第一个示例图,使用Matplotlib库和NumPy库创建一个折线图,其中X轴表示0到2π范围内均匀分布的数值,Y轴表示对应于X轴值的正弦函数的计算结果。通过创建图形和轴对象,然后在轴上绘制正弦函数的折线图:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, 200)
y = np.sin(x)

fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()

在这里插入图片描述

基本使用指南

导入相关库:

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

使用示例

Matplotlib在图表(例如windows, Jupyter widgets等)上绘制数据,每个图表可以包含一个或多个坐标轴(Axes),坐标轴是指定点的区域,可以是x-y坐标(在极坐标图中是theta-r,在3D图中是x-y-z等)。使用最简单的方法创建一个带有坐标轴的图表是使用pyplot.subplots。然后,我们可以使用Axes.plot在坐标轴上绘制一些数据。

fig, ax = plt.subplots()  # 创建一个包含单个坐标轴的图形。
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])  # 在坐标轴上绘制一些数据。
  • 显示图形: 使用plt.show()函数可以在程序中显示图形。
plt.show()
  • 保存图形: 使用plt.savefig()函数可以将图形保存为图像文件,支持多种图像格式,例如PNG、JPEG、SVG等。您需要在函数中提供文件名及文件类型。
plt.savefig("my_plot.png")  # 保存为PNG格式
plt.savefig("my_plot.jpg")  # 保存为JPEG格式
plt.savefig("my_plot.svg")  # 保存为SVG格式

默认情况下,图形将以当前工作目录为基准保存。如果想要保存到不同的目录,可以提供完整的文件路径。

完整代码:

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()  # 创建一个包含单个坐标轴的图形。
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])  # 在坐标轴上绘制一些数据。

# 显示图形
plt.show()
# 保存图形为PNG文件
plt.savefig("my_plot.png")

在这里插入图片描述

Figure的组成部分

下图展示了Matplotlib的各个组成部分。

../../_images/解剖学.png

主要由以下几部分组成:

  1. 图形(Figure)

    首先是整个图形部分。图形(Figure)跟踪所有子坐标轴(Axes)、一组“特殊”的图元(标题、图例、颜色条等),甚至是嵌套的子图(subfigures)。

    创建新图形最简单的方式是使用pyplot:

    fig = plt.figure()  # 一个没有坐标轴的空图形
    fig, ax = plt.subplots()  # 一个带有单个坐标轴的图形
    fig, axs = plt.subplots(2, 2)  # 一个带有2x2网格坐标轴的图形
    # 一个在左侧有一个坐标轴,右侧有两个坐标轴的图形:
    fig, axs = plt.subplot_mosaic([['left', 'right_top'],
                                   ['left', 'right_bottom']])
    

    比如最后一个图:

    在这里插入图片描述

    通常,一起创建坐标轴和图形会很方便,但也可以稍后手动添加坐标轴。请注意,许多Matplotlib后端支持在图形窗口上进行缩放和平移。

  2. 坐标轴(Axes)

    坐标轴(Axes)是附加在图形上的图元(Artist),它包含一个用于绘制数据的区域,并通常包含两个轴对象(在3D情况下为三个轴对象,注意Axes与Axis之间的区别),这些轴对象提供刻度和刻度标签,为坐标轴上的数据提供了刻度。每个坐标轴还有一个标题(通过set_title()设置)、一个x轴标签(通过set_xlabel()设置)、以及一个y轴标签(通过set_ylabel()设置)。

    坐标轴(Axes)类及其成员函数是使用面向对象编程(OOP)接口与Matplotlib交互的主要入口点,并且大多数绘图方法都在其上定义(例如上面提到的ax.plot()使用了plot方法)。

  3. 轴(Axis)对象

    轴(Axis)对象用于设置刻度尺度和限制范围,并生成刻度(轴上的标记)和刻度标签(标记刻度的字符串)。刻度的位置由定位器(Locator)对象确定,刻度标签字符串由格式化器(Formatter)格式化。正确的定位器和格式化器的组合可以对刻度位置和标签进行非常精细的控制。

  4. 图元(Artist)

    基本上,图形上的所有可见内容都是图元(Artist)(甚至包括图形、坐标轴和轴对象)。这包括文本对象、Line2D对象、集合对象、Patch对象等等。当图形呈现时,所有的图元都会被绘制到画布上。大多数图元都与一个坐标轴相关联;这样的图元不能被多个坐标轴共享,也不能从一个坐标轴移动到另一个坐标轴。

参考下面的示例:

import matplotlib.pyplot as plt
import numpy as np

# 设置全局字体为支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定微软雅黑或其他中文字体

# 创建一个新的图形和坐标轴(Axes)
fig, ax = plt.subplots()

# 设置坐标轴的标题、x轴标签和y轴标签
ax.set_title('示例图形')  
ax.set_xlabel('X轴')  
ax.set_ylabel('Y轴')

# 生成一些样本数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 使用坐标轴上的方法绘制数据
line, = ax.plot(x, y, label='正弦曲线')

# 添加图例
ax.legend()

# 设置刻度范围和刻度标签
ax.set_xlim(0, 10)
ax.set_ylim(-1, 1)
ax.set_xticks([0, 5, 10])
ax.set_yticks([-1, 0, 1])
ax.set_xticklabels(['起始', '中间', '结束'])
ax.set_yticklabels(['低', '中', '高'])

# 获取x轴和y轴对象
x_axis = ax.xaxis
y_axis = ax.yaxis

# 设置x轴和y轴的刻度定位器和格式化器
x_axis.set_major_locator(plt.MultipleLocator(2))
y_axis.set_major_formatter(plt.FuncFormatter(lambda value, _: f'{value:.1f}'))

# 添加文本标签作为图元
ax.text(3, 0.5, '文本标签', fontsize=12, color='red')

# 显示绘图结果
plt.show()

在这里插入图片描述

绘图函数的输入类型

在绘图过程中,绘图函数预期的输入类型是numpy.arraynumpy.ma.masked_array,或者是可以转换为numpy.array的对象,可以通过numpy.asarray进行转换。类似于数组的数据结构(被称为’array-like’),比如pandas数据对象和numpy矩阵,可能无法在绘图函数中按预期工作。为了遵循通用惯例,建议在绘图之前将这些数据结构转换为numpy.array对象。例如,要将numpy.matrix转换为numpy.array

pythonCopy codeb = np.matrix([[1, 2], [3, 4]])
b_asarray = np.asarray(b)

大多数绘图方法也可以接受可寻址的对象,如字典、numpy.recarraypandas.DataFrame。Matplotlib允许通过提供data关键字参数来生成绘图,从而传递与x和y变量对应的字符串。这样做可以更方便地生成图形。

例如生成一个基于随机数据的彩色和大小可变的散点图:

import matplotlib.pyplot as plt
import numpy as np

# 设置随机数生成器的种子以确保随机数据可重现
np.random.seed(19680801)

# 创建一个数据字典,包含多个键值对,表示不同的数据
data = {'a': np.arange(50),  # 连续整数数组
        'c': np.random.randint(0, 50, 50),  # 随机整数数组
        'd': np.random.randn(50)}  # 随机正态分布数组
data['b'] = data['a'] + 10 * np.random.randn(50)  # 'b'数组是'a'数组加上随机偏移
data['d'] = np.abs(data['d']) * 100  # 'd'数组是绝对值乘以100的随机正态分布数组

# 创建一个图形,包含单个坐标轴,设置图形的大小和布局
fig, ax = plt.subplots(figsize=(5, 2.7), constrained_layout=True)

# 使用散点图函数在坐标轴上绘制散点图
# x轴数据来自'a'键,y轴数据来自'b'键,点的颜色由'c'键的值决定,点的大小由'd'键的值决定
ax.scatter('a', 'b', c='c', s='d', data=data)

# 设置x轴和y轴的标签
ax.set_xlabel('entry a')
ax.set_ylabel('entry b')

# 显示绘制的图形
plt.show()

在这里插入图片描述

若要每次图形随机呈现,则注释掉 np.random.seed(19680801)

代码风格

Matplotlib提供了两种主要方式来创建和使用其功能,每种方式都有其独特的方法:显式接口和隐式接口。

显式接口(面向对象风格): 在显式接口中,需要显式地创建Figure和Axes对象,然后在这些对象上调用方法来构建和自定义图形。这种风格通常被称为"面向对象(OO)风格"。以下是一个演示面向对象风格的示例:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2, 100)  # 示例数据

# 显式创建Figure和Axes对象
fig, ax = plt.subplots(figsize=(5, 2.7), constrained_layout=True)

# 在Axes上绘制数据
ax.plot(x, x, label='线性')
ax.plot(x, x**2, label='二次')
ax.plot(x, x**3, label='三次')

# 自定义图形
ax.set_xlabel('x 轴标签')
ax.set_ylabel('y 轴标签')
ax.set_title("简单绘图")
ax.legend()  # 添加图例

隐式接口(pyplot风格): 在隐式接口中,依赖pyplot来管理Figure和Axes的创建。这种风格适用于快速、简单的绘图。以下是一个演示pyplot风格的示例:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2, 100)  # 示例数据

# 使用pyplot函数绘图
plt.figure(figsize=(5, 2.7), constrained_layout=True)
plt.plot(x, x, label='线性')
plt.plot(x, x**2, label='二次')
plt.plot(x, x**3, label='三次')
plt.xlabel('x 轴标签')
plt.ylabel('y 轴标签')
plt.title("简单绘图")
plt.legend()

两种风格都能达到同样的目标,但它们提供不同级别的控制和灵活性。显式接口(面向对象风格)适用于更复杂、自定义的可视化,而隐式接口(pyplot风格)适用于更简单、更快速的绘图。

注意,上面的示例中会出现中文字体无法显示的情况,需要添加代码设置全局字体后方能正常显示

# 设置全局字体为支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定微软雅黑或其他中文字体

在这里插入图片描述

创建辅助函数

如果需要多次使用不同数据集制作相同的图形,或者想要轻松封装Matplotlib方法,可以使用下面推荐的函数签名创建辅助函数。

def my_plotter(ax, data1, data2, param_dict):
    """
    一个制作图形的辅助函数。
    """
    out = ax.plot(data1, data2, **param_dict)
    return out

可以使用这个辅助函数两次,分别用于填充两个子图:

data1, data2, data3, data4 = np.random.randn(4, 100)  # 生成4组随机数据
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(5, 2.7))
my_plotter(ax1, data1, data2, {'marker': 'x'})
my_plotter(ax2, data3, data4, {'marker': 'o'})

这段代码定义了一个名为my_plotter的辅助函数,用于在给定的坐标轴上绘制图形。函数中的param_dict参数允许您传递额外的参数,以便于对图形进行定制。在本示例中,我们生成了四组随机数据,然后通过my_plotter函数绘制了两个子图,每个子图都使用不同的数据和标记。

使用数据文件

Matplotlib允许从数据文件中加载数据并绘制图形。常见的数据文件格式包括CSV(逗号分隔值)和TXT(文本)文件。常见的使用Pandas库加载数据文件。例如,如果数据文件是CSV格式,可以使用pandas.read_csv()函数加载数据。

import matplotlib.pyplot as plt
import pandas as pd

# 从CSV文件加载数据
data = pd.read_csv('data.csv')

# 获取x和y列的数据
x = data['x']
y = data['y']

# 创建折线图
plt.plot(x, y, label='折线图')
plt.xlabel('X轴标签')
plt.ylabel('Y轴标签')
plt.title('数据折线图')
plt.legend()
plt.show()
  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NICKMAN-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值