Python plot动态绘图

近期想用ESP32做个无线示波器,arduino开发环境自带udp示例,再加上adc代码,很容易完成。于是思路产生
1.电脑端用Python的socket接收数据,并用plot动态绘图,代码如下
‘’’
#coding=gbk
import socket
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import struct

初始化数据列表

data = []

创建socket对象

server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

绑定地址和端口

server_ip = ‘172.20.10.8’
server_port = 8080
server_socket.bind((server_ip, server_port))

定义绘图更新函数

def update_plot(frame):
global data
# 接收4字节的二进制数据(一个浮点数)
#packed_data = client_socket.recv(4)
packed_data, addr =server_socket.recvfrom(1024)
if packed_data:
# 解包二进制数据为浮点数
value, = struct.unpack(‘f’, packed_data)
data.append(value)
if len(data) > 100:
data.pop(0) # 保持数据长度为100
else:
print(“No more data”)
plt.close()

# 清除当前的图形
plt.cla()
plt.plot(data)
plt.ylim(-1.5, 1.5)  # 根据正弦函数的范围设置y轴限制

创建图形和轴对象

fig, ax = plt.subplots()
ani = animation.FuncAnimation(fig, update_plot, interval=50)

显示图形

plt.show()

关闭连接

client_socket.close()
server_socket.close()
‘’’

2.先用手机上Python作为数据发送端测试一下能否工作,手机端代码如下
‘’’
#coding=gbk
import socket
import time
import math
import struct

创建UDP socket对象

client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

服务器的IP地址和端口号

server_ip = ‘172.20.10.8’
server_port = 8080

发送数据

try:
for i in range(200): # 发送200个数据点
x = i * 0.1 # x值
y = math.sin(x) # 计算正弦值
# 将浮点数打包为二进制格式
packed_data = struct.pack(‘f’, y)
client_socket.sendto(packed_data, (server_ip, server_port))
time.sleep(0.001) # 每0.001秒发送一次
finally:
client_socket.close()
‘’’
3.运行效果
发送接近1ms
发送非常快,间隔约1ms
4.电脑端Python延时较高
视频截图
200个点数据,0.3秒已发送完成,17秒才放完动画
(无法传视频,感兴趣的小伙伴可以尝试)

后续再传ESP32的效果,再换个上位机,Python太慢了。

### Python `plot_surface` 使用颜色名称 在 Matplotlib 中绘制三维表面图时,可以使用多种方式来设置颜色。当希望使用特定的颜色名称而不是默认的色彩映射(colormap),可以通过参数调整实现这一点。 对于 `plot_surface` 函数而言,如果想要应用单一颜色到整个表面上,则可以直接通过 `color` 参数传递一个标准的颜色字符串给该函数调用[^1]。然而,在实际操作中通常会发现直接指定单色的方式不如预期那样直观,因为这可能会导致渲染出来的颜色看起来比较暗淡[^3]。 为了确保颜色能够按照期望显示,并且避免可能出现的颜色过深问题,建议采用如下方法之一: - **使用 `facecolors` 参数**:此参数允许为每一个多边形面片单独定义颜色。这样就可以精确控制各个部分的颜色表现。 - **关闭阴影效果 (`shade=False`) ** :有时候,默认开启的光照模型会使某些区域显得较暗。因此禁用这个特性可以帮助保持颜色的一致性和亮度。 下面是一个具体的例子展示如何利用这些技巧创建具有自定义颜色的 3D 表面图表: ```python import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np fig = plt.figure() ax = fig.add_subplot(111, projection='3d') x = np.linspace(-5, 5, 100) y = np.linspace(-5, 5, 100) X, Y = np.meshgrid(x, y) Z = np.sin(np.sqrt(X**2 + Y**2)) # 定义统一使用的颜色名 custom_color = 'skyblue' # 应用 facecolors 和 disable shading 来获得更好的视觉效果 surf = ax.plot_surface( X, Y, Z, color=custom_color, # 设置整体颜色 shade=False # 禁用阴影处理以防止颜色变暗 ) plt.show() ``` 这段代码将会生成一张背景为天蓝色(`'skyblue'`) 的平滑三维正弦波曲面图,而不会受到额外光源影响造成的色调变化干扰。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值