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

news2024/11/26 11:11:19

使用 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_type
    if 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_type
    if 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_type
    if 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.coloradmin.cn/o/2223060.html

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

相关文章

使用 Python 的 BeautifulSoup(bs4)解析复杂 HTML

使用 Python 的 BeautifulSoup(bs4)解析复杂 HTML:详解与示例 在 Web 开发和数据分析中,解析 HTML 是一个常见的任务,尤其是当你需要从网页中提取数据时。Python 提供了多个库来处理 HTML,其中最受欢迎的就…

C++ 整型大数运算(大整数运算)项目

C 整型大数运算项目 一、项目介绍二、项目变量成员三、项目实现构造函数加法减法乘法先计算再进位边计算边进位 除法与取模判断输入输出 四、项目源代码展示在 Big_integer.h 中:在 Big_integer.cpp 中: 五、测试准确性六、优化方向 一、项目介绍 整型大…

Character AI被起诉!14岁青少年自杀,AI陪伴何去何从

终于,AI在青少年心理问题方面,被推上了风口浪尖。 最近,美国佛罗里达州,一名14岁男孩Sewell Setzer的父母控告Character AI公司,声称孩子沉迷该公司的AI聊天机器人,最后走上了自杀的道路。 跟AI聊天还能致…

基于STM32F103的按键检测仿真

基于STM32F103的按键检测 仿真软件: Proteus 8.17 编程软件: Keil 5 仿真实现: 按键第一次按下LED灯亮,第二次按下LED灯灭,往复 按键检测原理: 按键在电路中一端接单片机的IO口,一端接GND&a…

高效库存管理:金蝶云星空与管易云的盘亏单对接方案

高效库存管理:金蝶云星空与管易云的盘亏单对接方案 金蝶云星空与管易云的盘亏单对接方案 在企业日常运营中,库存管理是至关重要的一环。为了实现高效、准确的库存盘点和数据同步,我们采用了轻易云数据集成平台,将金蝶云星空的数据…

JavaWeb合集20-定时任务框架SpringTask

二十、Spring Task 定时任务框架:Spring Task是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 1、Spring Task cron 表达式 cron表达式在线生成器: https://cron.qqe2.com/ cron表达式其实就是一个字符串,通过cron…

极值点与拐点 专题小结

基础知识点 极值点与拐点的知识点 极值点相关概念了解 拐点相关概念了解极值点定义了解 二次函数求根公式理解 1、两个交点的解 2、单个交点的解 3、无交点的情况 含参数的函数 含参二次函数与x轴交点个数影响正负性变化,从而达成条件是否有极值点和拐点。 多重…

优先算法——移动零(双指针)

目录 1. 题目解析 2. 算法原理 3.代码实现 题目: 力扣题目链接:移动零 1. 题目解析 题目截图如下: 不过要注意,这个移动题目要求是在原数组中原地操作,不能新额外开辟一个数组来修改。 2. 算法原理 这个原理可以称之为数…

qt 滚动条 美化

qt QScrollBar 滚动条分为竖直与水平滚动条,两者设置上类似,但也有一些不同,下面主要讲述美化及注意事项。 一、竖直滚动条 竖直滚动条分为7个部分: sub-line、 up-arrow 、sub-page、 hanle、 add-line、 dow-arrow、 add-pag…

SQLI LABS | Less-8 GET-Blind-Boolian Based-Single Quotes

关注这个靶场的其它相关笔记:SQLI LABS —— 靶场笔记合集-CSDN博客 0x01:过关流程 输入下面的链接进入靶场(如果你的地址和我不一样,按照你本地的环境来): http://localhost/sqli-labs/Less-8/ 靶场提示 …

前端实现监控埋点

前端实现监控埋点 前言 我们在应用开发完成本地测试跑通以后上线,线上可能会出现一些测试没有测出来的问题,那么这个时候我们如何定位到哪里会出现问题呢,因为在测试环境可能浏览器的不同,或是没有做兜底出现了一些线上的问题&a…

TLS协议基本原理与Wireshark分析

01背 景 随着车联网的迅猛发展,汽车已经不再是传统的机械交通工具,而是智能化、互联化的移动终端。然而,随之而来的是对车辆通信安全的日益严峻的威胁。在车联网生态系统中,车辆通过无线网络与其他车辆、基础设施以及云端服务进行…

取消element-ui中账号和密码登录功能浏览器默认的填充色,element-ui登录账号密码输入框禁用浏览器默认填充色问题

标题 问题展示 修改后 <div class="loginForm"><el-formref="formB":model="formDataB":rules="rulesB"class="login-form"label-position="left"><el-form-item prop="userNo" clas…

Spring Boot与Flyway实现自动化数据库版本控制

一、为什么使用Flyway 最简单的一个项目是一个软件连接到一个数据库&#xff0c;但是大多数项目中我们不仅要处理我们开发环境的副本&#xff0c;还需要处理其他很多副本。例如&#xff1a;开发环境、测试环境、生产环境。想到数据库管理&#xff0c;我们立刻就能想到一系列问…

Java最全面试题->Java基础面试题->JavaWeb面试题->Maven面试题

文章目录 Maven什么是maven&#xff1f;maven优缺点&#xff1f;maven常见的依赖范围有哪些?maven 坐标的含义?maven 常用命令?maven构建的过程&#xff1f;maven的生命周期&#xff1f;使用“mvn clean package”命令进行项目打包&#xff0c;该命令具体做了什么&#xff1…

Tcp_Sever(线程池版本的 TCP 服务器)

Tcp_Sever&#xff08;线程池版本的 TCP 服务器&#xff09; 前言1. 功能介绍及展示1.1 服务端连接1.2 客户端连接&#xff08;可多个用户同时在线连接服务端&#xff09;1.3 功能服务1.3.1 defaultService&#xff08;默认服务&#xff09;1.3.2 transform&#xff08;大小写转…

【STM32 ADC】

STM32 ADC功能简介 文章目录 前言一、ADC简介二、逐次逼近型ADC三、STM32的ADC内部框图四、STM32ADC输入通道五、规则组的四种转换模式六、规则组的触发源七、数据对齐八、转换时间九、校准部分十.ADC采样测量电压的程序设计十一、ADC的迟滞比较、滤波设计十二、四通道ADC采用问…

【github小问题】——push后报错error: src refspec master does not match any

温馨提示&#xff1a;这个问题可能有多种问题导致如未commit&#xff0c;本文在此讲述的是我遇到的这一种情况。 一、问题描述 从本地上传文件至github仓库时&#xff0c;add和commit都执行了且成功&#xff0c;但是执行git push -u origin master后出现了&#xff1a;error: …

深入理解JavaScript:两大编程思想和ES6类以及对象概念解析

文章目录 两大编程思想ES6中的类和对象 两大编程思想 面向过程 &#xff08;Procedural-Oriented Programming&#xff0c;POP&#xff09; 定义&#xff1a;面向过程的编程是一种基于过程调用的编程范式&#xff0c;它将程序看作是一系列函数或过程的集合。每个函数负责完成…

【K8S系列】Kubernetes pod节点Unknown 问题及解决方案详解【已解决】

在 Kubernetes 中&#xff0c;Pod 的状态为 Unknown 表示无法获取 Pod 的当前状态。这通常意味着 Kubernetes API 服务器无法与 Pod 所在的节点通信&#xff0c;或者 Kubelet 进程遇到问题。以下将详细介绍 Unknown 状态的原因、解决方案以及如何配置健康检查以提高系统的稳定性…