当前位置: 首页 > news >正文

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

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

相关文章:

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

使用 NumPy 和 Matplotlib 实现交互式数据可视化 在数据分析中,交互式可视化可以更好地帮助我们探索和理解数据。虽然 Matplotlib 是静态绘图库,但结合一些技巧和 Matplotlib 的交互功能(widgets、event handlers),我…...

TCP 攻击为何在 DDoS 攻击中如此常见

分布式拒绝服务攻击(Distributed Denial of Service, DDoS)是一种常见的网络攻击手段,通过大量请求使目标服务器过载,导致合法用户无法访问服务。在众多 DDoS 攻击类型中,TCP 攻击尤为常见。本文将探讨 TCP 攻击在 DDo…...

未来汽车驾驶还会有趣吗?车辆动力学系统简史

未来汽车驾驶还会有趣吗?车辆动力学系统简史 本篇文章来源:Schmidt, F., Knig, L. (2020). Will driving still be fun in the future? Vehicle dynamics systems through the ages. In: Pfeffer, P. (eds) 10th International Munich Chassis Symposiu…...

LCD手机屏幕高精度贴合

LCD手机屏幕贴合,作为智能手机生产线上至关重要的一环,其质量直接关乎用户体验与产品竞争力。这一工艺不仅要求屏幕组件间的无缝对接,达到极致的视觉与触觉效果,还需确保在整个生产过程中,从材料准备到最终成品&#x…...

15_卸载操作

在之前我们就提到,首次渲染之后,后续如果再调用 render 函数时,传递的 vnode 为 null 则表示是卸载。 当时我们是直接通过执行 container.innerHTML ‘’ 来实现的,但是这样做会有以下几个问题,如下: 容…...

ONLYOFFICE 文档8.2版本已发布:PDF 协作编辑、改进界面、性能优化等更新

ONLYOFFICE 在线编辑器最新版本已经发布,其中包含30多个新功能和500多个错误修复。阅读本文了解所有更新。 关于 ONLYOFFICE 文档 ONLYOFFICE 是一个开源项目,专注于高级和安全的文档处理。坐拥全球超过 1500 万用户,ONLYOFFICE 是在线办公领…...

redis的string是怎么实现的

Redis 的 String 类型是最基本的数据类型,底层通过多种方式实现,能够存储字符、整数、浮点数等各种形式的值。String 数据结构的实现基于 Redis 的简单动态字符串(SDS),同时在处理不同的数据类型时也进行了优化。 1. …...

基于STM32设计的智能婴儿床(华为云IOT)(244)

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成【4】ESP8266工作模式配置1.2 设计思路【1】整体设计思路【2】整体构架【3】上位机开发思路1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要1.4 开发工具的选择【1…...

html+css+js实现Notification 通知

实现效果&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Notif…...

【Linux】拆分详解 - 常见指令和权限理解

文章目录 前言一、常用指令1. 基本查看与路径跳转1.1文件与目录1.2 ls 指令&#xff08;显示文件&#xff09;1.3 pwd &#xff08;查看当前目录&#xff09;1.4 clear &#xff08;清屏&#xff09;1.5 whoami &#xff08;查看用户名&#xff09;1.6 cd&#xff08;跳转路径&…...

UniHttp 框架,请求http接口

项目案例下载地址: https://download.csdn.net/download/jinhuding/89902024 1.快速开始 2.1引入依赖 <dependency><groupId>io.github.burukeyou</groupId><artifactId>uniapi-http...

C++20中头文件ranges的使用

<ranges>是C20中新增加的头文件&#xff0c;提供了一组与范围(ranges)相关的功能&#xff0c;此头文件是ranges库的一部分。包括&#xff1a; 1.concepts: (1).std::ranges::range:指定类型为range&#xff0c;即它提供开始迭代器和结束标记(it provides a begin iterato…...

设计一个html+css+js的注册页,对于注册信息进行合法性检测

综合使用HTML、JavaScript和CSS进行注册页面设计&#xff0c;实现以下若干功能&#xff1a; 注意整个页面的色调和美观使用FramesetTable布局&#xff08;div也可&#xff09;对用户ID和用户名、口令不符合条件及时判断对口令不一致进行及时判断&#xff08;34的及时判断&#…...

语音识别——使用Vosk进行语音识别

文章目录 前言一、Vosk模型1.准备好所需要的语音包2.下载使用 二、使用示例1.文件读取示例2.结合麦克风演示 总结 前言 如何编译Vosk请参照之前的文章&#xff0c;ubuntu编译kaldi和vosk Vosk是语音识别开源框架&#xff0c;支持二十种语言 - 中文&#xff0c;英语&#xff0…...

element ui中el-image组件查看图片的坑

比如说上传组件使用el-image-viewer组件去看,如果用错了,你会发现,你每次只能看一张图片 <template><div><el-upload action="#" list-type="picture-card" :auto-upload="false" :file-list="fileList"@change=&qu…...

LabVIEW水质监测系统

在面对全球性的海洋污染问题时&#xff0c;利用先进技术进行水质监测成为了保护海洋环境的关键手段之一。开发了一种基于LabVIEW的海洋浮标水质监测系统&#xff0c;该系统能够实时监测并评估近海水域的水质状况&#xff0c;旨在为海洋保护和污染防治提供科技支持。 项目背景 …...

SpringMVC之 文件上传和下载

1. 文件上传 1.1 前端注意事项 文件上传操作&#xff0c;前端的表单项需要如下三项设置&#xff1a; &#xff08;1&#xff09;input标签的type属性应设置为file&#xff0c;并且注意不要在input标签中设置value属性&#xff0c;因为这可能导致文件上传不成功&#xff1b; …...

LeetCode Hot 100:二分查找

LeetCode Hot 100&#xff1a;二分查找 35. 搜索插入位置 思路 1&#xff1a;lower_bound class Solution { public:int searchInsert(vector<int>& nums, int target) {return lower_bound(nums.begin(), nums.end(), target) - nums.begin();} };思路 2&#xf…...

打包方式-jar和war的区别

1、jar包 JAR包是类的归档文件&#xff0c;与平台无关的文件格式&#xff0c;其实jar包就是java的类进行编译生成的class文件进行打包的压缩包。 JAR以ZIP文件格式为基础&#xff0c;与ZIP不同的是&#xff0c;JAR不仅用于压缩和发布&#xff0c;还用于部署和封装库、组件和插…...

【论文+源码】基于spring boot的垃圾分类网站

创建一个基于Spring Boot的垃圾分类网站涉及多个步骤&#xff0c;包括环境搭建、项目创建、数据库设计、后端服务开发、前端页面设计等。下面我将引导您完成这个过程。 第一步&#xff1a;准备环境 确保您的开发环境中安装了以下工具&#xff1a; Java JDK 8 或更高版本Mav…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...