使用 NumPy 和 Matplotlib 实现交互式数据可视化
使用 NumPy 和 Matplotlib 实现交互式数据可视化
在数据分析中,交互式可视化可以更好地帮助我们探索和理解数据。虽然 Matplotlib 是静态绘图库,但结合一些技巧和 Matplotlib 的交互功能(widgets、event handlers),我们可以实现交互式图表。本文将展示如何使用 NumPy 和 Matplotlib 构建交互式数据可视化,帮助你从新的角度探索数据。
好的!下面是每个交互式数据可视化示例的完整代码实现,包含滑块、按钮和单选按钮。
一、创建交互式滑块图
这是一个带滑块的交互式正弦波图表,滑块控制正弦波的频率变化。
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()
五、总结
本文展示了如何使用 NumPy 和 Matplotlib 创建交互式数据可视化。通过滑块、按钮和单选按钮的结合,我们可以动态探索数据的变化。这种交互式图表非常适用于数据探索和展示,例如实时监控、信号处理等场景。
你可以进一步扩展这些功能,如添加更多的控件、响应鼠标事件,或将交互式图表嵌入到应用程序中,为用户提供更友好的数据体验。
相关文章:

使用 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 通知
实现效果: 代码实现: <!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 指令(显示文件)1.3 pwd (查看当前目录)1.4 clear (清屏)1.5 whoami (查看用户名)1.6 cd(跳转路径&…...

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

设计一个html+css+js的注册页,对于注册信息进行合法性检测
综合使用HTML、JavaScript和CSS进行注册页面设计,实现以下若干功能: 注意整个页面的色调和美观使用FramesetTable布局(div也可)对用户ID和用户名、口令不符合条件及时判断对口令不一致进行及时判断(34的及时判断&#…...

语音识别——使用Vosk进行语音识别
文章目录 前言一、Vosk模型1.准备好所需要的语音包2.下载使用 二、使用示例1.文件读取示例2.结合麦克风演示 总结 前言 如何编译Vosk请参照之前的文章,ubuntu编译kaldi和vosk Vosk是语音识别开源框架,支持二十种语言 - 中文,英语࿰…...
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水质监测系统
在面对全球性的海洋污染问题时,利用先进技术进行水质监测成为了保护海洋环境的关键手段之一。开发了一种基于LabVIEW的海洋浮标水质监测系统,该系统能够实时监测并评估近海水域的水质状况,旨在为海洋保护和污染防治提供科技支持。 项目背景 …...

SpringMVC之 文件上传和下载
1. 文件上传 1.1 前端注意事项 文件上传操作,前端的表单项需要如下三项设置: (1)input标签的type属性应设置为file,并且注意不要在input标签中设置value属性,因为这可能导致文件上传不成功; …...
LeetCode Hot 100:二分查找
LeetCode Hot 100:二分查找 35. 搜索插入位置 思路 1:lower_bound class Solution { public:int searchInsert(vector<int>& nums, int target) {return lower_bound(nums.begin(), nums.end(), target) - nums.begin();} };思路 2…...

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

【论文+源码】基于spring boot的垃圾分类网站
创建一个基于Spring Boot的垃圾分类网站涉及多个步骤,包括环境搭建、项目创建、数据库设计、后端服务开发、前端页面设计等。下面我将引导您完成这个过程。 第一步:准备环境 确保您的开发环境中安装了以下工具: Java JDK 8 或更高版本Mav…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...