2017-04-27 6 views
0

Ich habe Daten in einer Datei. Es sieht wie folgt aus:Verwenden einer Bedingung aus Dateidaten zu plotten mit Matplotlib Python

08:00,user1,1 
08:10,user3,2 
08:15,empty,0 
.... 

Wie konnte ich binäre Daten mit Stunden auf x-axis und Benutzer auf y-axis plotten. Benutzer werden je nach Benutzer mit verschiedenen Markierungen gekennzeichnet. Zum Beispiel können user1 als * und user3 bezeichnet werden als o bezeichnet werden. Und y-axis ist 1 für Benutzer und 0 für leer. Die Zahlen (in der Textdatei) nach dem Benutzernamen sollen in der Bedingung entscheiden, welche Markierung es sein wird.

Hier ist ein Bild von dem, was ich tun möchte.

enter image description here

Antwort

0

Sie können die Datei mit np.recfromcsv laden. Wir konvertieren dann die Zeitspalte in Datetime-Objekte, für die wir eine convtime-Funktion definieren. Dann verwenden wir diese Funktion, um Ihre CSV-Datei einzulesen.

import numpy as np 
import matplotlib.pyplot as plt 
convtime = lambda x: datetime.datetime.strptime(x, "%H:%M") 
all_records = np.recfromcsv("myfilename.csv", names=["time", "user", "val"], converters={0:convtime}) # This says parse column 0 using the convtime function 

Beachten Sie, dass, da wir nur die Zeit Teil datetime gegeben haben, wird es das Datum übernehmen zum 1. Januar 1900. Sie können einen maßgeblichen Zeitpunkt, um es hinzuzufügen, wenn Sie sich interessieren.

Jetzt, um die Daten zu plotten. Dies bringt uns zu einem seltsamen Problem, wo Matplotlib nur ein Symbol für alle Punkte verwenden kann, die gezeichnet werden. Das bedeutet leider, dass wir eine for-Schleife verwenden müssen. Lassen Sie uns zunächst dict s für das Symbol und Farbe für jeden Benutzer definieren:

symbols = {'user1':'*', 'user3':'o', 'empty':'x'} 
colours = {'user1':'blue', 'user3':'red', 'empty':'orange'} 
for rec in all_records: 
    plt.scatter(rec['time'], rec['val'], c=colours[rec['user']], marker=symbols[rec['user']]) 

Das fast tut es. Wir vermissen immer noch die Legende. Ein Nachteil dieser for-Schleife besteht darin, dass jede Zeile in Ihrer Datei einen Eintrag in der Legende enthält. Wir schlagen das, indem wir eine benutzerdefinierte Legende erstellen.

import matplotlib.lines as mlines 
legend_list = [] 
for user in symbols.keys(): 
    legend_list.append(mlines.Line2D([], [], color=colours[user], marker=symbols[user], ls='none', label=user)) 
plt.legend(loc='upper right', handles=legend_list) 
plt.show() 

Das macht es! Wenn Ihr Diagramm gequetscht aussieht, verwenden Sie plt.xlim(), um die Grenzwerte nach Ihrem Geschmack anzupassen.

Verwandte Themen