【问题标题】:How to use FuncAnimation in a Time Series plot?如何在时间序列图中使用 FuncAnimation?
【发布时间】:2019-08-01 18:21:39
【问题描述】:

我正在模拟传感器将数据发送到一台服务器,它将数据值(从 1 到 3 随机)和完整日期 (Y-m-d H:m:s) 保存到数据库中。

我的绘图程序正在访问数据库并在数据输入时绘制数据。起初我认为它不起作用,但只要我绘制我的 x 轴不是日期时间(所以它基本上会绘制如果我使用日期的“字符串”作为该轴上的刻度)

我现在有所改变,有一个时间序列的功能“情节区域”,但这些点不再自动进入我的情节。如果我重新运行程序,就会出现这些点。

我的代码:

%matplotlib notebook
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
import matplotlib.dates as mdates
from matplotlib.dates import date2num
from dateutil import parser
from bokeh.plotting import figure
import sqlite3
from mpldatacursor import datacursor
import pandas as pd
import datetime as dt
from datetime import datetime


fig = plt.figure(figsize = (10,4))

ax1 = fig.add_subplot(111)


def animate(i):

    datas = []
    dates = []

    con = sqlite3.connect('edgedb')
    c = con.cursor()
    c.execute('SELECT data, timestamp FROM edgedata')
    data = c.fetchall()


    for row in data:
        datas.append(pd.to_datetime(row[1], format = '%Y-%m-%d %H:%M:%S').time())
        dates.append(float(row[0]))


    ax1.clear()
    ax1.plot_date(x = datas, y = dates, color = 'darkgreen', ls='-', marker='o')
    ax1.set_xticks(datas)

    plt.xticks(rotation=60, ha='right')
    plt.subplots_adjust(bottom=0.30)
    #ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M:%S'))

    plt.gca().xaxis.set_major_locator(mdates.DateFormatter('%Y-%m-%d %H:%M:%S'))

    ax1.grid(True)

    plt.ion()


def print_coords(**kwargs):
    return 'Valor medido : {y:.6f} às {x:s}'.format(y=kwargs['y'],                                                 x=mdates.num2date(kwargs['x']).strftime('%H:%M:%S'))

datacursor(ax1, formatter = print_coords)


ani = animation.FuncAnimation(fig, animate, interval=1000)


plt.show()

在 animate 函数中不使用参数 i 的情况下,代码运行良好,我已经尝试绘制一个空图(线,= ax1.plot_dates([],[]) )然后将数据设置在里面动画函数(line.set_data(x,y)),但到目前为止没有成功。

提前致谢!

【问题讨论】:

  • 我猜你在绘制 time 时会遇到问题,而是尝试绘制完整的日期时间。

标签: python python-3.x matplotlib animation


【解决方案1】:

好吧,看来我找到了让它发挥作用的方法。

将 xaxis 定位器更改为:

plt.gca().xaxis.set_major_locator(mdates.AutoDateLocator())

瞧,每次更新数据库时它都会更新!

谢谢

【讨论】:

    猜你喜欢
    • 2020-09-27
    • 2018-10-31
    • 2021-12-02
    • 1970-01-01
    • 2020-07-28
    • 2020-02-22
    • 2021-03-23
    • 2018-08-31
    • 1970-01-01
    相关资源
    最近更新 更多