2017-04-27 93 views
0

我有一個文件中的數據。它看起來像這樣:從文件數據使用條件與matplotlib繪圖python

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

我怎麼能與x-axis小時和用戶對y-axis繪製的二進制數據。用戶將根據用戶用不同的標記表示。例如,user1被表示爲*user3,表示爲oy-axis爲用戶10爲空。 用戶名後面的數字(在文本文件中)旨在決定條件語句中的 它將是哪個標記。

這是我想要做的一張照片。

enter image description here

回答

0

您可以加載np.recfromcsv文件。然後,我們將時間列轉換爲日期時間對象,爲此我們定義一個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月1日1900年,如果你關心你可以添加相關的日期吧。

現在,繪製數據。這給我們帶來了一個奇怪的問題,matplotlib只能爲繪製的所有點使用一個符號。不幸的是,這意味着我們必須使用for循環。首先,讓我們定義dict S爲符號和色彩爲每個用戶:

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

幾乎做的。我們仍然錯過了這個傳說。這個for循環的缺點是文件中的每一行都會在圖例中創建一個條目。我們通過創建自定義圖例來打敗這個。

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()來調整你的口味限制。

相關問題