我有一个文件,我作为熊猫系列加载。但是,该文件在单个节点机器上加载很大,我想在图表上更新这些值时一次读取几行文件。
文件数据的示例如下所示:
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()
,但它不起作用。谢谢
(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图的最有效方法,但它接近你的代码。