2017-02-28 1 views
1

J'ai un fichier que j'ai chargé en tant que série panda. Cependant, le fichier est gros à charger sur une machine à un seul noeud et j'aimerais lire le fichier quelques lignes à la fois tout en mettant à jour ces valeurs sur un graphique.Comment tracer un graphique en temps réel à partir d'une série panda? Et lire par intermittence à partir d'un fichier

Un échantillon des données de fichier est indiqué ci-dessous:

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, 

Un échantillon de mon code est indiqué ci-dessous:

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 

Ceci, cependant, crée plusieurs fenêtres. J'ai essayé d'utiliser la fonction plt.draw() à la place de plt.show() mais cela ne fonctionne pas. Merci

Répondre

1

(1) Si vous voulez tracer les mêmes axes, au lieu d'une nouvelle figure, vous devez fournir un des axes matplotlib existants ax objet à la méthode de tracé de la trame de données

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

(2) L'appel plt.show() ouvre une fenêtre qui prend en charge la boucle d'événements. Le script restant s'arrête jusqu'à ce que vous fermiez cette fenêtre. L'appeler à l'intérieur d'une boucle doit donc être évité. plt.draw() est approprié pour dessiner à l'intérieur d'une boucle en mode interactif. Par conséquent, plt.ion() doit être appelé avant la boucle.

(3) L'utilisation de time.sleep() est une mauvaise idée lorsque vous travaillez avec des éléments GUI comme la fenêtre de traçage matplotlib. Il laisse littéralement l'application en veille, entraînant une fenêtre qui ne répond pas. Utilisez plutôt plt.pause().

(4) Vous devez spécifier les données à tracer dans la méthode plot de la trame de données. Aussi, vous devez effacer les axes, sinon les anciennes parcelles resteront dans l'intrigue.

Maintenant, voici un script de travail qui anime une trame de données.

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() 

Ce n'est pas la méthode la plus efficace de l'animation matplotlib graphiques, mais il est proche de votre code.

+0

Merci pour vos commentaires et modifications. Le code fonctionne parfaitement, proche du code initial. – TheSolider