2017-07-14 75 views
0

我有數據是這樣的:情節時間軸圖沒有任何計數

Id  recordDate bodytag  recordType 
123 2017-05-02 A    A1 
123 2017-05-05 B    B1 
123 2017-05-10 A    A1 
123 2017-04-02 A    A1 
234 2016-05-17 C    C1 
234 2016-06-14 D    D1 
234 2016-05-25 D    D1 
234 2017-05-13 D    D1 
234 2017-05-13 C    C1 
234 2016-05-25 C    C1 
234 2017-05-13 C    C1 

現在我要繪製時間線圖一樣,患者ID 123對日期17年2月5日有疼痛的組合部分並且具有捕獲記錄A1並且在日期05/5/17在身體部分B中具有疼痛,因此他捕獲了記錄B1。對於每個用戶我想製作這種時間線圖表。

我該如何在Python中做到這一點?

到目前爲止,我想這件事

fig, ax = plt.subplots(figsize=(6,1)) 
ax.plot_date(dump['recordDate'],dump['Actual_bodyTags']) 
fig.autofmt_xdate() 

# everything after this is turning off stuff that's plotted by default 
""" 
ax.yaxis.set_visible(False) 
ax.spines['right'].set_visible(False) 
ax.spines['left'].set_visible(False) 
ax.spines['top'].set_visible(False) 
ax.xaxis.set_ticks_position('bottom') 

ax.get_yaxis().set_ticklabels([]) 
day = pd.to_timedelta("1", unit='D') 
#plt.xlim(X[0] - day, X[-1] + day) 
""" 

plt.show() 

而且這樣的:

fig = ff.create_gantt(dump, colors=['#333F44', '#93e4c1'], index_col='Complete', show_colorbar=True, 
         bar_width=0.2, showgrid_x=True, showgrid_y=True) 
py.iplot(fig, filename='gantt-use-a-pandas-dataframe', world_readable=True) 
+0

也許用'plotly'的甘特圖功能:https://plot.ly/python/gantt/ –

+0

沒有人知道如何去做吧 ? – Jitesh

+0

也許很多人都知道如何做到這一點,但沒有人願意爲你做這件事,甚至沒有你展示你的嘗試。如果你第一次嘗試一些東西,看看文檔和例子,你遇到了一個問題,每個人都很樂意幫助你。顯示你的嘗試,你是卡... –

回答

1

一種可能的方法是隻散點圖條目,並添加文本到每個。首先從您的文本文件加載數據(如果您使用的是標準CSV文件,請刪除delimiterskipinitialspace)。接下來它將條目分類到字典中,其中的鍵是id。對於每個ID它創建一個單獨的數字。每個ID的所有條目都按日期排序。如果單個日期有多個條目,則它們的文本會垂直合併到一個條目中以避免覆蓋。該月的日子也添加到文本中。

from collections import defaultdict 
import matplotlib.pyplot as plt 
import matplotlib.dates as dates 

from itertools import groupby 
from datetime import datetime 
import csv 

data = defaultdict(list) 

with open('input2.txt', 'rb') as f_input: 
    csv_input = csv.reader(f_input, delimiter=' ', skipinitialspace=True) 
    header = next(csv_input) 

    for row in csv_input: 
     row.append(datetime.strptime(row[1], '%Y-%m-%d')) 
     row.append(dates.date2num(row[4])) 
     data[row[0]].append(row) 

bbox = dict(facecolor='blue', alpha=0.1, pad=1.0) 

for rows in data.values(): 
    fig = plt.figure(figsize=(10, 2)) 
    ax = fig.add_subplot(111) 

    # Get date range 
    d = sorted(row[5] for row in rows) 
    ax.set_xlim(d[0]-10, d[-1]+10) 
    ax.set_ylim(0, 0.8) 

    for k, g in groupby(sorted(rows), lambda x: x[4]): 
     rows = list(g) 
     text = '{}\n\n{}'.format(k.day, '\n'.join([row[2] for row in rows])) 

     ax.scatter(rows[0][5], 0.1, s=5, c='black') 
     ax.text(row[5], 0.15, text, ha="center", va="bottom", fontsize=7.0, bbox=bbox) 

    fig.suptitle(row[0]) 
    fig.subplots_adjust(bottom=0.2)  # Add space at bottom 
    ax.xaxis.set_major_locator(dates.MonthLocator()) 
    #ax.xaxis.set_minor_locator(dates.DayLocator()) 
    ax.xaxis.set_major_formatter(dates.DateFormatter('%Y\n%m')) 
    ax.yaxis.set_ticks([]) 

plt.show() 

這將顯示一個ID爲:

matplotlib scatter plot

+0

正如我所說的每個個人用戶我想這樣的圖形,但這對於多個用戶。 – Jitesh

+0

謝謝,讓我試一試,如有任何問題,我會聯繫您。 – Jitesh

+0

如果我想刪除Recordtype,該怎麼辦?我應該做什麼改變? – Jitesh