如何从熊猫系列中绘制实时图表?并从文件中间歇性地阅读

问题描述 投票:1回答:1

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

文件数据的示例如下所示:

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

但是,这会创建多个窗口。我试图用plt.draw()函数代替plt.show(),但它不起作用。谢谢

python matplotlib graph real-time series
1个回答
1
投票

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

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

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

(3)使用像matplotlib绘图窗口这样的GUI元素时,使用time.sleep()是一个坏主意。它实际上让应用程序休眠,导致窗口无响应。请改用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图的最有效方法,但它接近你的代码。

© www.soinside.com 2019 - 2024. All rights reserved.