如何绘制 pandas 系列的实时图表?并间歇性地从文件中读取

How to plot a real-time graph from a pandas series? And reading intermittently from a file

我有一个作为熊猫系列加载的文件。但是,该文件太大,无法在单节点计算机上加载,我想一次读取几行文件,同时在图表上更新这些值。

文件数据示例如下所示:

ip,date,time,zone,cik,accession,extention,code,size,idx,norefer,noagent,find,crawler,browser
101.81.76.dii,2016-03-31,00:00:00,0.0,1283497.0,0001209191-16-111028,-index.htm,200.0,14926.0,1.0,0.0,0.0,10.0,0.0,
104.40.128.jig,2016-03-31,00:00:00,0.0,1094392.0,0001407682-16-000270,.txt,200.0,5161.0,0.0,0.0,0.0,10.0,0.0,

我的代码示例如下所示:

data = pd.read_csv('filepath')
data2 = data[['ip','time','date','size']]
data2['size/MB']= data2['size']/1024
data3 = data2[['ip','time','date','size/MB']]
gr = data3.groupby(['date','time']).sum()
GB = gr['size/GB']= gr['size/MB']/1024

columns = ["size/MB"]
df=GB[0:0]
"""plt.ion()"""
plt.figure()
i=10
while i<len(GB):
    df = df.append(GB[0:i])
    ax = df.plot(secondary_y=['prex'])
    plt.show()
    tm.sleep(0.5)
    i+=10

然而,这会创建多个 windows。我尝试使用 plt.draw() 函数代替 plt.show() 但它不起作用。 谢谢

(1) 如果你想绘制到相同的轴上,而不是新的图形,你需要提供一个现有的 matplotlib 轴 ax 对象到数据框的绘图方法

DataFrame.plot(..., ax=ax)

(2) 调用 plt.show() 打开一个 window,它接管了事件循环。剩余的脚本将停止,直到您关闭此 window。因此需要避免在循环内调用它。 plt.draw() 适用于在交互模式下绘制循环。因此plt.ion()必须在循环之前调用。

(3) 在使用 GUI 元素(如 matplotlib 绘图 window 时,使用 time.sleep() 是个坏主意。它实际上让应用程序休眠,导致无响应 window。请改用 plt.pause()

(4) 您需要在数据框的绘图方法中指定要绘制的数据。另外你需要清除坐标轴,否则旧图将留在图中。

现在,这是一个工作脚本,它为数据帧设置动画。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

x = np.arange(100)
y = np.random.rand(100)
df = pd.DataFrame({"x":x, "y":y})
df2 = df[0:0]

plt.ion()
fig, ax = plt.subplots()
i=0
while i < len(df):
    df2 = df2.append(df[i:i+1])
    ax.clear()
    df2.plot(x="x", y="y", ax=ax)
    plt.draw()
    plt.pause(0.2)
    i+=1
plt.show()

这不是动画 matplotlib 图形的最有效方法,但它接近于您的代码。