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

ops/2024/10/25 14:51:06/

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

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


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


一、创建交互式滑块图

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

python">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()

在这里插入图片描述

二、实现按钮切换功能

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

python">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()

在这里插入图片描述


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

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

python">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()

在这里插入图片描述


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

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

python">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.ppmy.cn/ops/128365.html

相关文章

2000-2020年各地级市人类需求指数数据

2000-2020年各地级市人类需求指数数据 1、年份:2000、2010、2020年 2、指标:城市名称、HMDI2000、HMDI2010、HMDI2020 3、范围:341个地级市 4、说明:各城市的人类需求指数项目旨在全面评估Z国城市居民在不同社会发展阶段对自然…

前端性能优化之Canvas优化

元素是众多广泛使用的网络 2D 图像渲染标准之一。它被广泛用于游戏及复杂的图像可视化中。然而,随着网站和应用将 canvas 画布推至极限,性能开始成为问题。 Canvas 上下文切换 Canvas 绘制 API 都是在上下文context上进行调用,context不是一个普通的对象,当我们对其赋值的…

苍穹外卖05

redis 1. 启动redis .\redis-server.exe redis.windows.conf 2. 连接redis到客户端(这里我们使用ARDM图形化工具) 新建连接 一旦建立好后就永久直接可用(和mysql一个道理) 连接成功界面

「iOS」——AFNetworking的简单使用

iOS学习 前言原生网络请求使用AFNetworking库进行网络请求具体使用 单例创建的原因单例使用 总结 前言 我们之前学习了通过OC原生内容进行网络申请,AFNetworkikng第三方库的使用,可以极大地简化网络申请的代码量。 原生网络请求 网络请求主要分为上面五…

Python中的人工智能框架与实例

在人工智能(AI)领域,Python因其简洁的语法、丰富的库和强大的社区支持,成为了最受欢迎的编程语言之一。本文将详细介绍Python中的人工智能框架,并通过具体实例展示如何使用这些框架来实现不同的人工智能应用。 一、Python中的人工智能框架 …

【PyTorch】轻松应对 PyTorch 安装:兼容性问题解析

目录 引言1. 环境要求1.1 Python 版本1.2 操作系统1.3 CUDA 支持1.4 其他依赖项 2. 安装 PyTorch2.1 安装命令解析2.2 安装示例 3. PyTorch 安装错误3.1 错误原因分析3.2 错误处理步骤 4. 解决方案4.1 检查 Python 版本4.2 更新 pip4.3 安装特定版本4.4 降低 conda 中的 Python…

list的使用与实现

1.list的使用 list本质上是一个带头双向循环链表&#xff0c;因此遍历的时候不支持下标随机访问[ ] 1.2.list的构造函数 list有四种默认构造函数 无参构造 list<int> l1; //构造空的l1 n个val值构造 list<int> l2 (4,100); //l2中构造4个值为100的数 迭代器构…

webAPI中的节点操作、高级事件

一、节点操作 1.删除节点 node.removeChild(); 方法从node节点中删除一个子节点&#xff0c;返回删除的节点 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…