2017-04-27 6 views
0

私はファイルにデータを持っています。ファイルデータの条件を使ってmatplotlib pythonでプロットする

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

どのように私はy-axisx-axisとユーザーの時間とのバイナリデータをプロットできます。それはこのようになります。ユーザーは、ユーザーに応じて異なるマーカーで表示されます。例えば、user1*と表し、user3oとする。 y-axisは、ユーザーの場合は1、空の場合は0です。 ユーザー名の後の(テキストファイル内の)番号は、それがマーカとなる条件文で と決めるためのものです。

ここに私がしたい写真があります。

enter image description here

答えて

0

あなたはnp.recfromcsvでファイルを読み込むことができます。次に、時間列をdatetimeオブジェクトに変換します。このオブジェクトに対しては、convtime関数を定義します。次に、この関数を使用してCSVファイルを読み込みます。

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 

我々はdatetimeにちょうど時刻部分を与えているので、あなたが気にしている場合は、それに関連する日付を追加することができます1月1900年1として、それは日付を仮定することに注意してください。

ここで、データをプロットします。これは、matplotlibがプロットされているすべての点に対して1つのシンボルしか使用できないという興味深い問題につながります。残念ながら、これはforループを使用する必要があることを意味します。 はほとんどそれをしないこと

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']]) 

:まず、私たちは各ユーザのシンボルと色のdict Sを定義してみましょう。私たちはまだ伝説を見逃しています。このforループの欠点は、ファイル内のすべての行が凡例に1つのエントリを作成することです。私たちはカスタムレジェンドを作成することでこれを打ち負かしました。

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

それです!あなたのプロットが盛んに表示されたら、plt.xlim()を使用して好みに合わせて調整してください。

関連する問題