数据可视化入门:使用 Matplotlib、Numpy 和 SciPy 绘图

news2024/12/27 10:52:48

数据可视化是数据分析不可或缺的工具,它通过图形化手段帮助我们更直观地理解数据。Python拥有多种库来实现数据可视化,其中matplotlibnumpyscipy是最常用的几个。本文将详细介绍如何使用这些库来创建各种图表和曲面。

环境搭建

在开始之前,请确保您的Python环境中已安装这些库。如果尚未安装,可以通过以下命令进行安装:

pip install matplotlib numpy scipy

核心库简介

  • numpy:Python中用于科学计算的基础包,提供了强大的N维数组对象。
  • matplotlib:Python的绘图库,提供类似MATLAB的绘图框架。
  • scipy:基于numpy的算法和数学工具包,提供多种科学计算函数。

绘制曲面

以下是使用matplotlibnumpy绘制3D曲面的示例代码:

def draw_3d_surface(x, y, z, labels: list[str] = ['X', 'Y', 'Z'],
                    label_color: list[str] = ['#000000', '#000000', '#000000'], img_name='3D_Surface',
                    imgs_path: str = './imgs', is_save: bool = False, is_display: bool = True):
    """
    绘制3D曲面图
    :param x: x轴数据列表
    :param y: y轴数据列表
    :param z: 对应于x和y的z值列表
    :param labels: 坐标轴标签列表
    :param label_color: 坐标轴标签颜色列表
    :param img_name: 图形名称
    :param imgs_path: 图片保存路径
    :param is_save: 是否保存图片
    :param is_display: 是否显示图片
    example:
        x = np.linspace(-5, 5, 100)
        y = np.linspace(-5, 5, 100)
        x, y = np.meshgrid(x, y)
        z = np.sin(np.sqrt(x ** 2 + y ** 2))
        draw_3d_surface(x, y, z, labels=['X', 'Y', 'Z'], img_name='3D_Surface', is_save=True)
    """
    # 将列表转换为numpy数组
    if type(x) is not np.array:
        x = np.array(x)
    if type(x) is not np.array:
        y = np.array(y)
    if type(x) is not np.array:
        z = np.array(z)
    # 检查x和y的数据长度是否相等
    if len(x) != len(y) or len(x) != len(z):
        raise ValueError("x, y, z列表的长度必须相同")

    # 创建网格
    xg, yg = np.meshgrid(np.linspace(x.min(), x.max(), 100),
                         np.linspace(y.min(), y.max(), 100))
    # 使用最近邻插值来获取网格上的z值
    zg = griddata((x, y), z, (xg, yg), method='nearest')
    # 创建一个新的图和一个3D子图
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    # 绘制曲面图
    surf = ax.plot_surface(xg, yg, zg, cmap='viridis')
    # 设置坐标轴标签
    ax.set_xlabel(labels[0], color=label_color[0])
    ax.set_ylabel(labels[1], color=label_color[1])
    ax.set_zlabel(labels[2], color=label_color[2])
    # 设置图形标题
    plt.title(img_name)
    # 添加颜色条
    fig.colorbar(surf)
    # 保存图片
    if is_save:
        # 如果文件名不带.png,则添加.png
        if not img_name.endswith('.png'):
            img_name += '.png'
        file_path = os.path.join(imgs_path, img_name)
        os.makedirs(os.path.dirname(file_path), exist_ok=True)
        plt.savefig(file_path)
    if is_display:
        plt.show()

请注意,上述代码中的griddata函数用于数据插值,以便在3D空间中创建平滑的曲面。

请添加图片描述

请添加图片描述

绘制曲线

以下是使用matplotlib绘制折线图的示例代码:

def draw_liners(*args, labels: list[str] = ['X', 'Y'], label_color: list[str] = ['#000000', '#000000'],
                img_name: str = 'Liner', is_grid: bool = False, imgs_path: str = './imgs',
                is_save: bool = False, is_display: bool = True):
    """
    绘制线性图,支持多组数据和不同线型
    :param args: 包含(x, y, line_style, label)的元组列表
    :param labels: 坐标轴标签列表
    :param label_color: 坐标轴标签颜色列表
    :param img_name: 图形名称
    :param is_grid: 是否显示网格
    :param imgs_path: 保存路径
    :param is_save: 是否保存图片
    :param is_display: 是否显示图片
    example:
        x1 = [1, 2, 3, 4]
        y1 = [1, 4, 9, 16]
        x2 = [1, 2, 3, 4]
        y2 = [2, 4, 6, 8]
        draw_liners((x1, y1, '-', 'Line 1'), (x2, y2, '--', 'Line 2',), labels=['Time', 'Value'],
                    img_name='Multiple Curves', is_grid=True)
    """
    # 绘制每组数据
    for arg in args:
        # x轴数据,y轴数据,线型,标签
        x, y, line_style, label = arg
        plt.plot(x, y, linestyle=line_style, label=label)
    # 是否绘制网格
    if is_grid:
        plt.grid(True)

    plt.xlabel(labels[0], color=label_color[0])
    plt.ylabel(labels[1], color=label_color[1])
    plt.title(img_name)
    # 显示图例
    plt.legend()

    # 保存图片
    if is_save:
        # 如果文件名不带.png,则添加.png
        if not img_name.endswith('.png'):
            img_name += '.png'
        file_path = os.path.join(imgs_path, img_name)
        os.makedirs(os.path.dirname(file_path), exist_ok=True)
        plt.savefig(file_path)
    if is_display:
        plt.show()

请添加图片描述

分图绘制曲线

以下是使用matplotlib在一个图形窗口中绘制多个子图的示例代码:

def plot_subplots(*args, img_name: str = None, imgs_path: str = './imgs', is_save: bool = False,
                  is_display: bool = True):
    """
    绘制多个子图
    :param :
    *args: 可变参数,每个参数是一个元组,包含三个元素 (x_data, y_data, title,x_label,y_label),
           其中 x_data 和 y_data 是子图的数据,title 是子图的标题,x_label是x轴名称,y_label是y轴名称。
    img_name: 图片名称,默认为None,结尾不带.png
    imgs_path: 图片保存路径,默认为None,默认保存在当前目录下
    is_save: 是否保存图片,默认为False
    param is_display: 是否显示图片
    example:
        x1 = np.linspace(0, 10, 100)
        y1 = np.sin(x)
        x2 = np.linspace(0, 10, 100)
        y2 = np.cos(x)
        plot_subplots((x1, y1, 'title1', 'x_label1', 'y_label1'), (x2, y2, 'title2', 'x_label2', 'y_label2'),
        img_name='subplots', imgs_path='./imgs', is_save=True)
    """
    num_plots = len(args)
    # 计算子图的行数和列数
    rows = int(np.ceil(np.sqrt(num_plots)))
    cols = int(np.ceil(num_plots / rows))

    # 创建一个图形和子图
    fig, axs = plt.subplots(rows, cols, figsize=(5 * cols, 4 * rows))
    # 处理只有一个子图的情况
    if num_plots == 1:
        axs = [axs]

    # 遍历所有子图的数据并绘制
    for (x_data, y_data, title, x_label, y_label), ax in zip(args, axs.flatten()):
        ax.plot(x_data, y_data)
        ax.set_title(title)
        ax.set_xlabel(x_label)
        ax.set_ylabel(y_label)

    # 隐藏多余的子图
    for ax in axs.flatten()[num_plots:]:
        ax.remove()

    # 调整子图间距
    plt.tight_layout()
    # 保存图片
    if is_save:
        # 如果文件名不带.png,则添加.png
        if not img_name.endswith('.png'):
            img_name += '.png'
        file_path = os.path.join(imgs_path, img_name)
        os.makedirs(os.path.dirname(file_path), exist_ok=True)
        plt.savefig(file_path)
    if is_display:
        plt.show()

请添加图片描述

结论

结合使用numpy, matplotlib, 和scipy,Python提供了强大的数据可视化工具。无论是简单的折线图还是复杂的三维曲面,这些库都能帮助您以直观的方式展示数据。

  • matplotlib官方文档:了解更多绘图选项。
  • numpy文档:深入学习数组操作。
  • scipy文档:探索科学计算功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1992848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SPSS、Python员工满意度问卷调查激励保健理论研究:决策树、随机森林和AdaBoost|附代码数据

全文链接:https://tecdat.cn/?p37293 原文出处:拓端数据部落公众号 在深入了解公司当前的实际情况和员工内心真实想法的基础上,我们旨在从专业视角出发,为企业在组织管理方面的不足进行诊断,并进行全面审视。 为了…

激发创意:十大设计灵感网站推荐

在设计的世界里,灵感是推动创意发想和项目实现的关键因素。设计师们常常需要寻找新的灵感来源,以保持作品的新鲜感和创新性。幸运的是,互联网上有许多优秀的设计灵感网站,它们提供了丰富的资源和启发,帮助设计师们打破…

leetcode-二叉树oj题1(共三道 965,100,144)--c语言

目录 a. 二叉树的概念以及实现参照博客: 一、三道题的oj链接 二、每题讲解 1.单值二叉树 a. 题目: b. 题目所给代码 c. 思路 d. 代码: 2. 相同的树 a. 题目 b. 题目所给代码 c. 思路 d. 代码 3. 二叉树的前序遍历 a. 题目 b.…

软考:软件设计师 — 11.UML 建模

十一. UML 建模 UML 建模部分是下午场考试中第三个题目,分值 15 分。先介绍一下这类题目的考查形式。 1. 考察形式 (1)类图与对象图 填类名,方法名,属性名填关系填多重度 UML 中四种基本关系: 依赖关…

【IO模型】select、poll、epoll的区别

文章目录 五种IO模型阻塞IO非阻塞IO信号驱动IOIO复用异步IO IO复用的原理selectselect原理及缺点 pollpoll的原理及其缺点 epollepoll_createepoll_ctlepoll_waitepoll的原理水平触发和边缘触发epoll的优点 五种IO模型 I/O模型是操作系统中用于管理输入输出操作的机制。不同的…

多线程 02:线程实现,创建线程的三种方式,通过多线程下载图片案例分析异同(Thread,Runnable,Callable)

一、概述 记录时间 [2024-08-08] 前置知识:Java 基础篇;Java 面向对象 多线程 01:Java 多线程学习导航,线程简介,线程相关概念的整理 Java 多线程学习主要模块包括:线程简介;线程实现&#xff…

MySQL 体系架构

文章目录 一. MySQL 分支与变种1. Drizzle2. MariaDB3. Percona Server 二. MySQL的替代1. Postgre SQL2. SQLite 三. MySQL 体系架构1.连接层2 Server层(SQL处理层)3. 存储引擎层1)MySQL官方存储引擎概要2)第三方引擎3&#xff0…

【java】一维数组

目录 一维数组内存分析Java虚拟机的内存划分一维数组内存解析 一维数组知识点一维数组课后练习 一维数组内存分析 Java虚拟机的内存划分 为了提高运行效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。 java中…

cs224w colab0笔记

1.colab0 1.1 数据集 from torch_geometric.datasets import KarateClubdataset KarateClub() print(fDataset:{dataset}:) print() print(fNumber of graphs:{len(dataset)}) print(fNumber of features:{dataset.num_features}) print(fNumber of classes:{dataset.num_cl…

机器学习面试-核心概念-问题理解

1.机器学习的思想 计算机程序随着经验的积累,能够实现性能的提高。对于某一类任务T及其性能度量P,若一个计算机程序在T上以P衡量的性能随着经验E而自我完善,那么就称这个计算机程序在从经验E学习。 机器学习是人工智能的一个分支&#xff0c…

VMware Workstation 与 Device/Credential Guard 的不兼容问题

(1)出现问题 (2)出现问题原因: 我电脑原先弄过Hyper-V,这玩意是微软公司开发的一款虚拟化产品,它是微软第一个采用类似 VMware 和 Citrix Xen 等产品中的基于 hypervisor(虚拟机监控…

基于区块链的供应链应用开发

区块链的供应链溯源应用开发 一 、环境准备 (1)更新镜像源 apt update(2)安装(openssl、jdk、git) apt -y install openssl default-jdk git(3)配置JAVA_HOME环境变量 echo “export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/” >> /etc/profilesource /etc…

一键编译并启动一个 ARM Linux qemu 虚拟机

需要事先自己编译 qemu-system-arm 可执行文件; 1,编译创建ARM 虚拟机 1.1 一起从头开始版 cd 进一个空文件夹,然后 $ vim buildup.sh $ bash buildup.sh 访问github网络没什么问题: 硬编码了一个路径/home/hipper/ex_vexpre…

Java对象内存布局和Synchronized锁升级(二)

目录 对象内存布局对象头实例数据对齐填充锁在内存布局中的标志位 锁升级无锁偏向锁偏向锁升级 轻量级锁重量级锁 锁消除和锁粗化锁消除锁粗化 锁升级总结 对象内存布局 在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(I…

同态加密和SEAL库的介绍(八)性能

本篇会对比三种加密方案,同时每种方案配置三种参数。即九种情况下的各个操作的性能差异,为大家选择合适的方案和合适的参数提供参考。表格中所有时长的单位均为微妙,即 。 当然数据量比较大,为了方便大家查找&#xff0c…

应用商店故障(UOS系统)

应用商店故障(UOS系统) 1. 安装应用商店内的应用无法下载,更新系统时提示依赖关系被破坏,怎么办? 问题描述 安装应用商店内的应用无法下载,更新系统时均提示依赖关系被破坏 解决方案 1、可先建议用户尝试修…

day 22线程间通信

一、互斥锁 1、资源: 资源是有限的,在程序运行过程中,一段代码、一段空间、一个变量、CPU、内存都可以看做资源 2、互斥锁: 是一种资源,当一个线程任务加锁,其余线程任务无法再次加锁,直到解锁后才能加锁,互斥…

数据机房防静电措施有哪些?安装防静电地板时记住这几点

生活中静电无处不在,一般情况静电不会对我们有什么影响,但在一些特殊场合,比如数据机房、配电室、消控室、电子厂房等,静电的危害必须要引起重视,因为这些场合通常有比较多的电子设备,电子设备中有比较多的…

priority_queue模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾什么是适配器模式?准备工作包含头文件定义命名空间类的成员变量什么是仿函数?比较仿函数在priority_queue中的作用通过传入不同的仿函数可以做到大堆和小堆之间的切换通过传入不同的仿函数可以做到改变priority_qu…

[Leetcode][Medium]-面试题 17.14.最小k个数-TOP K问题-快排/大根堆

一、题目描述 原题地址 二、整体思路 (1)、快排 数组中最小的k个数就是说把数组升序排列,求[0,k-1]区间上的数。 快排可以得到一个元素在升序排序的数组中的正确位置。在这个位置的左边区间[l,l2-1]上的元素都比它小,在这个位置的右边区间[r2,r]上的元素…