使用 NumPy 和 Matplotlib 实现交互式数据可视化

使用 NumPy 和 Matplotlib 实现交互式数据可视化

在数据分析中,交互式可视化可以更好地帮助我们探索和理解数据。虽然 Matplotlib 是静态绘图库,但结合一些技巧和 Matplotlib 的交互功能(widgets、event handlers),我们可以实现交互式图表。本文将展示如何使用 NumPyMatplotlib 构建交互式数据可视化,帮助你从新的角度探索数据。


好的!下面是每个交互式数据可视化示例的完整代码实现,包含滑块、按钮和单选按钮。


一、创建交互式滑块图

这是一个带滑块的交互式正弦波图表,滑块控制正弦波的频率变化。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider# 创建时间序列数据
time = np.linspace(0, 10, 500)# 初始频率为 1 的正弦波
init_freq = 1
y = np.sin(2 * np.pi * init_freq * time)# 创建图表和初始曲线
fig, ax = plt.subplots()
plt.subplots_adjust(left=0.1, bottom=0.25)  # 调整图表布局,为滑块留出空间
line, = ax.plot(time, y, lw=2)# 设置轴范围
ax.set_xlim(0, 10)
ax.set_ylim(-1.5, 1.5)# 创建滑块 (位置 [x, y, 宽度, 高度])
ax_freq = plt.axes([0.1, 0.1, 0.65, 0.03], facecolor='lightgoldenrodyellow')
slider_freq = Slider(ax_freq, 'Frequency', 0.1, 5.0, valinit=init_freq)# 更新曲线函数
def update(val):freq = slider_freq.val  # 获取滑块的当前值line.set_ydata(np.sin(2 * np.pi * freq * time))fig.canvas.draw_idle()  # 更新图表# 将滑块与更新函数绑定
slider_freq.on_changed(update)# 展示图表
plt.show()

在这里插入图片描述

二、实现按钮切换功能

通过按钮在正弦波和余弦波之间切换的完整代码实现。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button# 创建时间序列数据
time = np.linspace(0, 10, 500)# 初始频率为 1 的正弦波
init_freq = 1
y = np.sin(2 * np.pi * init_freq * time)# 创建图表和初始曲线
fig, ax = plt.subplots()
plt.subplots_adjust(left=0.1, bottom=0.25)  # 调整图表布局,为滑块和按钮留出空间
line, = ax.plot(time, y, lw=2)# 设置轴范围
ax.set_xlim(0, 10)
ax.set_ylim(-1.5, 1.5)# 创建滑块
ax_freq = plt.axes([0.1, 0.1, 0.65, 0.03], facecolor='lightgoldenrodyellow')
slider_freq = Slider(ax_freq, 'Frequency', 0.1, 5.0, valinit=init_freq)# 更新曲线函数
def update(val):freq = slider_freq.val  # 获取滑块的当前值line.set_ydata(np.sin(2 * np.pi * freq * time))fig.canvas.draw_idle()  # 更新图表# 将滑块与更新函数绑定
slider_freq.on_changed(update)# 创建按钮
ax_button = plt.axes([0.8, 0.025, 0.1, 0.04])
button = Button(ax_button, 'Toggle Wave', color='lightblue', hovercolor='skyblue')# 切换波形的更新函数
wave_type = 'sine'def toggle_wave(event):global wave_typeif wave_type == 'sine':line.set_ydata(np.cos(2 * np.pi * slider_freq.val * time))wave_type = 'cosine'else:line.set_ydata(np.sin(2 * np.pi * slider_freq.val * time))wave_type = 'sine'fig.canvas.draw_idle()# 将按钮与更新函数绑定
button.on_clicked(toggle_wave)# 展示图表
plt.show()

在这里插入图片描述


三、使用单选按钮控制颜色

通过单选按钮改变正弦波颜色的完整代码实现。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons# 创建时间序列数据
time = np.linspace(0, 10, 500)# 初始频率为 1 的正弦波
init_freq = 1
y = np.sin(2 * np.pi * init_freq * time)# 创建图表和初始曲线
fig, ax = plt.subplots()
plt.subplots_adjust(left=0.3, bottom=0.3)  # 调整图表布局,为滑块和按钮留出空间
line, = ax.plot(time, y, lw=2)# 设置轴范围
ax.set_xlim(0, 10)
ax.set_ylim(-1.5, 1.5)# 创建滑块
ax_freq = plt.axes([0.1, 0.1, 0.65, 0.03], facecolor='lightgoldenrodyellow')
slider_freq = Slider(ax_freq, 'Frequency', 0.1, 5.0, valinit=init_freq)# 更新曲线函数
def update(val):freq = slider_freq.val  # 获取滑块的当前值line.set_ydata(np.sin(2 * np.pi * freq * time))fig.canvas.draw_idle()  # 更新图表# 将滑块与更新函数绑定
slider_freq.on_changed(update)# 创建按钮
ax_button = plt.axes([0.8, 0.025, 0.1, 0.04])
button = Button(ax_button, 'Toggle Wave', color='lightblue', hovercolor='skyblue')# 切换波形的更新函数
wave_type = 'sine'def toggle_wave(event):global wave_typeif wave_type == 'sine':line.set_ydata(np.cos(2 * np.pi * slider_freq.val * time))wave_type = 'cosine'else:line.set_ydata(np.sin(2 * np.pi * slider_freq.val * time))wave_type = 'sine'fig.canvas.draw_idle()# 将按钮与更新函数绑定
button.on_clicked(toggle_wave)# 创建单选按钮
ax_radio = plt.axes([0.02, 0.4, 0.15, 0.15], facecolor='lightgoldenrodyellow')
radio = RadioButtons(ax_radio, ('blue', 'red', 'green'), active=0)# 更新颜色的函数
def change_color(label):line.set_color(label)fig.canvas.draw_idle()# 将单选按钮与更新函数绑定
radio.on_clicked(change_color)# 展示图表
plt.show()

在这里插入图片描述


四、完整的多重交互功能实现

将滑块、按钮和单选按钮整合到一个界面中的完整代码实现。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons# 创建时间序列数据
time = np.linspace(0, 10, 500)# 初始频率为 1 的正弦波
init_freq = 1
y = np.sin(2 * np.pi * init_freq * time)# 创建图表和初始曲线
fig, ax = plt.subplots()
plt.subplots_adjust(left=0.3, bottom=0.3)  # 调整图表布局,为滑块和按钮留出空间
line, = ax.plot(time, y, lw=2)# 设置轴范围
ax.set_xlim(0, 10)
ax.set_ylim(-1.5, 1.5)# 创建滑块
ax_freq = plt.axes([0.1, 0.1, 0.65, 0.03], facecolor='lightgoldenrodyellow')
slider_freq = Slider(ax_freq, 'Frequency', 0.1, 5.0, valinit=init_freq)# 更新曲线函数
def update(val):freq = slider_freq.val  # 获取滑块的当前值line.set_ydata(np.sin(2 * np.pi * freq * time))fig.canvas.draw_idle()  # 更新图表# 将滑块与更新函数绑定
slider_freq.on_changed(update)# 创建按钮
ax_button = plt.axes([0.8, 0.025, 0.1, 0.04])
button = Button(ax_button, 'Toggle Wave', color='lightblue', hovercolor='skyblue')# 切换波形的更新函数
wave_type = 'sine'def toggle_wave(event):global wave_typeif wave_type == 'sine':line.set_ydata(np.cos(2 * np.pi * slider_freq.val * time))wave_type = 'cosine'else:line.set_ydata(np.sin(2 * np.pi * slider_freq.val * time))wave_type = 'sine'fig.canvas.draw_idle()# 将按钮与更新函数绑定
button.on_clicked(toggle_wave)# 创建单选按钮
ax_radio = plt.axes([0.02, 0.4, 0.15, 0.15], facecolor='lightgoldenrodyellow')
radio = RadioButtons(ax_radio, ('blue', 'red', 'green'),active=0)# 更新颜色的函数
def change_color(label):line.set_color(label)fig.canvas.draw_idle()# 将单选按钮与更新函数绑定
radio.on_clicked(change_color)# 展示图表
plt.show()

五、总结

本文展示了如何使用 NumPyMatplotlib 创建交互式数据可视化。通过滑块、按钮和单选按钮的结合,我们可以动态探索数据的变化。这种交互式图表非常适用于数据探索和展示,例如实时监控、信号处理等场景。

你可以进一步扩展这些功能,如添加更多的控件、响应鼠标事件,或将交互式图表嵌入到应用程序中,为用户提供更友好的数据体验。

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

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

相关文章

UE5里的TObjectPtr TSharedPtr TWeakPtr有什么区别

在 Unreal Engine(UE)编程中,TObjectPtr、TSharedPtr 和 TWeakPtr 都是 指针类型,但它们在生命周期管理和使用场景上有不同的特点。让我们详细分析这些指针的区别和用途。 TObjectPtr TObjectPtr 是 UE5 中引入的新智能指针类型…

水轮发电机油压自动化控制系统解决方案介绍

在现代水电工程中,水轮机组油压自动化控制系统,不仅直接关系到水轮发电机组的安全稳定运行,还影响着整个水电站的生产效率和经济效益。 一、系统概述 国科JSF油压自动控制系统,适用于水轮发电机组调速器油压及主阀(蝶…

Dongle Sentinal在Jenkins下访问不了的问题

背景: 工作站部署的jenkins的脚本无法正常打包,定位后发现是本地获取不了license,但是使用usb over network的远程license都能获取并正常打包 分析: 获取不了license的原因是本地无法识别dongle。根据提供信息,之前…

SAP_SD模块-销售订单创建价格扩大10倍问题分析及后续订单价格批量更新问题处理

一、业务背景 我们公司的销售订单,是通过第三方销售管理平台创建好订单后,把表头和行项目数据,定时推送到SAP;SAP通过自定义表ZZT_ORDER_HEAD存放订单表头数据,通过ZZT_ORDER_DETAIL存放行项目数据;然后再用…

深入探讨 HTTP 请求方法:GET、POST、PUT、DELETE 的实用指南

文章目录 引言GET 方法POST 方法PUT 方法DELETE 方法小结适用场景与特点总结最佳实践 在 API 设计中的重要性 引言 HTTP 协议的背景:介绍 HTTP(超文本传输协议)作为互联网的基础协议,自 1991 年发布以来,成为客户端和…

探索AI人工智能机器学习:解锁未来科技的钥匙

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 前言:…

GPS/北斗时空安全隔离装置(卫星时空防护装置)使用手册

GPS/北斗时空安全隔离装置(卫星时空防护装置)使用手册 GPS/北斗时空安全隔离装置(卫星时空防护装置)使用手册 时空安全隔离装置采用先进的防欺骗抗干扰技术,能够有效检测识别欺骗干扰信号,并快速对异常信号进行关断、切换,消除欺骗干扰影响。…

安全见闻(4)——开阔眼界,不做井底之蛙

内容预览 ≧∀≦ゞ 安全见闻四:操作系统安全机制深度解析声明操作系统机制1. 注册表2. 防火墙3. 自启动与计划任务4. 事件日志5. 内核驱动与设备驱动6. 系统服务7. 进程与线程8. 系统编程 从操作系统机制看病毒设计1. 自启动:病毒如何在系统启动时运行&a…

【C#】使用Visual Studio创建Windows Forms应用程序计算对角线之和

文章目录 使用Visual Studio创建Windows Forms应用程序计算对角线之和步骤 1: 创建新的Windows Forms应用程序项目步骤 2: 设计窗体步骤 3: 编写代码步骤 4: 运行程序步骤 5: 运行结果 使用Visual Studio创建Windows Forms应用程序计算对角线之和 大家好!今天&…

Spring Boot:植物健康的智能守护者

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

【网络原理】TCP/IP五层网络模型之网络层-----IP协议详解,建议收藏!!

💐个人主页:初晴~ 📚相关专栏:计算机网络那些事 前几篇文章中我们深入研究了TCP协议,因为TCP协议在我们日常开发中的使用频率非常高。而相比之下,IP协议与我们普通程序员关系就没那么近了。一般是专门开发…

数字 图像处理算法的形式

一 基本功能形式 按图像处理的输出形式,图像处理的基本功能可分为三种形式。 1)单幅图像 单幅图像 2)多幅图像 单幅图像 3)单(或多)幅图像 数字或符号等 二 几种具体算法形式 1.局部处理邻域对于任一…

ABSD 和 DSSA对比

ABSD(Application-Based Software Development,基于应用的软件开发)和 DSSA(Domain-Specific Software Architecture,领域专用软件架构)是两种不同的软件开发方法,主要区别在于开发的目的和应用…

libevent源码剖析-event

1 简介 本文来重点介绍下libevent中的event事件,在类unix系统中编写网络程序时,我们经常需要处理3类事件-IO事件&signal事件&timer事件,libevent通过reactor来注册&调度&处理IO事件,并且也将signal和timer事件借助…

2024年10月21日计算机网络,乌蒙第一部分

【互联网数据传输原理 |OSI七层网络参考模型】 https://www.bilibili.com/video/BV1EU4y1v7ju/?share_sourcecopy_web&vd_source476fcb3b552dae37b7e82015a682a972 mac地址相当于是名字,ip地址相当于是住址,端口相当于是发送的东西拿什…

SPI通信(W25Q64)

目录 一.前言 1.SPI的简介 2.SPI的应用 3. SPI的硬件电路 4. SPI硬件电路设计的核心 5. SPI时序基本单元 二. W25Q64简介 1. 芯片简介 2. (非)易失性存储器 3. 引脚定义 4. W25Q64框图 5. Flash操作的注意事项 三. SPI读写W25Q64(使用软件…

一文教会你如何使用 iLogtail SPL 处理日志

作者:阿柄 随着流式处理的发展,出现了越来越多的工具和语言,使得数据处理变得更加高效、灵活和易用。在此背景下,SLS 推出了 SPL(SLS Processing Language) 语法,以此统一查询、端上处理、数据加工等的语法&#xff0…

rpc的客户端为什么称为stub

1.client为什么是stub Stub 在分布式系统中是一种 代理对象(Proxy Object),它本质上是一个在本地系统中扮演远程服务角色的代理。 在早期的 RPC 术语中,客户端端叫做 Stub,而服务器端的处理部分叫做 Skeleton。这种对…

vue3使用i18n做国际化多语言,实现常量跟随语言切换翻译

因为我有一个常量的配置文件在项目中,而且有中文内容,我想在切换语言的时候,跟着这个翻译也实时切换,就可以使用computed计算属性实现。 把name改成下面的样子: name: computed(() > t(pad.regularMode)), 就可以…

深度学习:元学习(Meta-Learning)详解

元学习(Meta-Learning)详解 元学习,也称为“学会学习”,是机器学习中的一个重要子领域,旨在开发能够快速适应新任务或环境的模型,即使这些任务的可用数据非常有限。元学习的核心思想是通过经验学习如何学习…