如何绘制 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 图形的最有效方法,但它接近于您的代码。
我有一个作为熊猫系列加载的文件。但是,该文件太大,无法在单节点计算机上加载,我想一次读取几行文件,同时在图表上更新这些值。
文件数据示例如下所示:
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 图形的最有效方法,但它接近于您的代码。