我是靠谱客的博主 精明果汁,最近开发中收集的这篇文章主要介绍将实时生成的数据用matplotlib画动态曲线,并将数据写入csv文件中,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

背景:
最近有个需求,需要将数据画成折线图便于观察,并且数据是实时生成的(与时间有关),数据数量不确定,在网上看到大多数都是基于固定数据来进行画图,很少有将动态生成的数据画成图形的,因此研究了一下。

实现思路:

  1. 使用库:画图用matplotlib实现
  2. 获取跟随时间变化的数据,并将时间作为x轴,数据作为y轴
  3. 写一个循环,将数据“动态刷新”在画板上
  4. 由于数据数量不确定,因此x轴显示的数量个数最好固定(不然数据太多挤在一堆不好看),例如显示20个数据,当总数据个数超过20个后,将第一个数据不显示(将列表中的第一个值删除),最后一位新增一个数据,整体呈现的效果就是整个图像在向x轴的负方向移动。

方法实现不难,详情请见下列代码:

import matplotlib.pylab as plt
import time
import numpy as np
import random
from matplotlib.pyplot import MultipleLocator
import csv

x_list = []     # 用于存放x轴数据
y_list = []     # 用于存放y轴数据
temp_list_x = []    # 临时存放x轴数据
temp_list_y = []    # 临时存放y轴数据
show_num = 10   # x轴显示的数据个数,例:show_num = 10表示x轴只显示10个数据
num = 0

plt.ion()	# 打开交互模式
fig1 = plt.figure(figsize=(100,80))             # 设置图片大小
plt.xlim(0, show_num)	                        # 设置x轴的数值显示范围
x_major_locator=MultipleLocator(2)	            # 把x轴的刻度间隔设置为2
y_major_locator=MultipleLocator(10)		        # 把y轴的刻度间隔设置为10
ax=plt.gca()	                                # ax为两条坐标轴的实例
ax.xaxis.set_major_locator(x_major_locator)	    # 把x轴的主刻度设置为2的倍数
ax.yaxis.set_major_locator(y_major_locator)	    # 把y轴的主刻度设置为10的倍数


def write_data(x, y):
    """
    将数据写入csv文件中保存
    :param x: x轴数据
    :param y: y轴数据
    :return:
    """
    f = open('文件名.csv','a+',encoding="utf-8",newline="")
    csv_writer = csv.writer(f)
    # 写入csv文件内容
    csv_writer.writerow([x, y])
    f.close()

# 创建表头
f = open('文件名.csv','a+',encoding="utf-8",newline="")
csv_writer = csv.writer(f)
# 表头
csv_writer.writerow(["时间", "data"])

while True:
    y = random.randint(30, 100)
    y_list.append(y)
    temp_list_y.append(y)
    x = time.strftime("%H:%M:%S", time.localtime(time.time()))
    x_list.append(x)
    temp_list_x.append(x)
    write_data(x, y)
    if num > show_num:
        temp_list_x.remove(temp_list_x[0])
        temp_list_y.remove(temp_list_y[0])
        # plt.clf()     # 清除轴,当前活动轴在当前图中。 它保持其他轴不变。
        plt.cla()       # 清除整个当前数字。与所有的轴,但离开窗口打开,这样它就可以再用在其他的 plots上了。
        # plt.close()   # 关上窗户,如果未另指定,则该窗口将是当前窗口
    plt.plot(temp_list_x, temp_list_y, c='r', ls='-')   # 将图像显示出来
    plt.pause(1)	# 等待1s
    num += 1

plt.ioff()		# 关闭交互模式
plt.show()

注:上述方法实现起来略显粗糙,当前只提供一种思路,没有进行细节优化。

最后

以上就是精明果汁为你收集整理的将实时生成的数据用matplotlib画动态曲线,并将数据写入csv文件中的全部内容,希望文章能够帮你解决将实时生成的数据用matplotlib画动态曲线,并将数据写入csv文件中所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部