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

使用 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_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.kler.cn/news/364010.html

相关文章:

  • java-实例化一个List,然后添加数据的方法详解
  • U9的插件开发之BE插件(1)
  • 【数据结构与算法】之队列详解
  • TDengine 与北微传感达成合作,解决传统数据库性能瓶颈
  • android 微信分享报:签名不对,请检查签名是否与开发平台签名一致的解决
  • [分享] SQL在线编辑工具(好用)
  • 【Android】AHandler/AMessage/ALooper机制
  • Java:关于哈希表
  • 2024年808数据结构答案
  • css知识点梳理
  • 如何在服务器上部署开源大模型 GLM-4-9B-Chat 并应用到RAG应用中
  • 【传知代码】机器学习在情绪预测中的应用(论文复现)
  • 虚拟机的 NAT 模式 或 Bridged 模式能够被外界IPping通
  • IDEA无法生成自动化序列serialVersionUID及无法访问8080端口异常的解决方案
  • 计算机毕业设计PySpark+大模型农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop
  • 【亚马逊云】基于 Amazon EKS 搭建开源向量数据库 Milvus
  • 【ArcGIS Pro实操第4期】绘制三维地图
  • Java如何自定义线程池
  • Python + 查看个人下载次数小工具 - 记录
  • 【.Net】【C#】Program.cs通用代码模板
  • AJAX中get和post的区别
  • 【自动化测试之oracle数据库】MacOs如何安装oracle- client
  • Matlab|电价负荷需求响应-考虑电价变动
  • 线性可分支持向量机的原理推导 9-25对拉格朗日函数L(w,b,α) 关于w求导 公式解析
  • 深入浅出神经网络:从基础原理到高级应用
  • mysql 13 MySQL基于规则的优化