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

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

http://www.lryc.cn/news/468799.html

相关文章:

  • TCP 攻击为何在 DDoS 攻击中如此常见
  • 未来汽车驾驶还会有趣吗?车辆动力学系统简史
  • LCD手机屏幕高精度贴合
  • 15_卸载操作
  • ONLYOFFICE 文档8.2版本已发布:PDF 协作编辑、改进界面、性能优化等更新
  • redis的string是怎么实现的
  • 基于STM32设计的智能婴儿床(华为云IOT)(244)
  • html+css+js实现Notification 通知
  • 【Linux】拆分详解 - 常见指令和权限理解
  • UniHttp 框架,请求http接口
  • C++20中头文件ranges的使用
  • 设计一个html+css+js的注册页,对于注册信息进行合法性检测
  • 语音识别——使用Vosk进行语音识别
  • element ui中el-image组件查看图片的坑
  • LabVIEW水质监测系统
  • SpringMVC之 文件上传和下载
  • LeetCode Hot 100:二分查找
  • 打包方式-jar和war的区别
  • 【论文+源码】基于spring boot的垃圾分类网站
  • 【C++ STL 模板类】pair 键值对
  • paddleocr使用FastDeploy 部署工具部署 rknn 模型
  • Apple Vision Pro市场表现分析:IDC最新数据揭示的真相
  • Mybatis-04.入门-JDBC
  • 拥抱云开发的未来:腾讯云数据库、云模板与AI智能化的应用场景探索
  • 新手铲屎官求推荐,噪音低的宠物空气净化器应该用哪款
  • 玄机平台-应急响应-webshell查杀
  • LeetCode Hot 100:图论
  • tracert和ping的区别
  • 回归、分类模型的评估指标
  • k8s中如何将pod的标准输出日志输出到一个文件