2016-10-10 120 views
0

我有以下的源數據(其來自csv文件):水平條形圖

ABC,2016-6-9 0:00,95,"{'//Purple': [115L], '//Yellow': [403L], '//Blue': [16L], '//White-XYZ': [0L]}" 
ABC,2016-6-10 0:00,0,"{'//Purple': [219L], '//Yellow': [381L], '//Blue': [90L], '//White-XYZ': [0L]}" 
ABC,2016-6-11 0:00,0,"{'//Purple': [817L], '//Yellow': [21L], '//Blue': [31L], '//White-XYZ': [0L]}" 
ABC,2016-6-12 0:00,0,"{'//Purple': [80L], '//Yellow': [2011L], '//Blue': [8888L], '//White-XYZ': [0L]}" 
ABC,2016-6-13 0:00,0,"{'//Purple': [32L], '//Yellow': [15L], '//Blue': [4L], '//White-XYZ': [0L]}" 
DEF,2016-6-16 0:00,0,"{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [3L]}" 
DEF,2016-6-17 0:00,0,"{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [0L]}" 
DEF,2016-6-18 0:00,0,"{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [7L]}" 
DEF,2016-6-19 0:00,0,"{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [14L]}" 
DEF,2016-6-20 0:00,0,"{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [21L]}" 

我使用How to remove curly braces, apostrophes and square brackets from dictionaries in a Pandas dataframe (Python)到數據轉換爲一個數據幀,我可以用來繪製某些變量。數據幀如下所示(注:不一樣的數據,什麼是源csv文件,但結構是一樣的):

Company Date   Code  Yellow  Blue  White  Black 

0 ABC  2016-6-9  115  403   16   19   472  
1 ABC  2016-6-10 219  381   90   20   2474 
2 ABC  2016-6-11 817  21   31   88   54 
3 ABC  2016-6-12 80   2011  8888  0   21 
4 ABC  2016-6-13 21   15   46   20   56 
5 DEF  2016-6-16 64   42   76   4   41 
6 DEF  2016-6-17 694  13   84   50   986 
7 DEF  2016-6-18 325  485   38   60   174 
8 DEF  2016-6-19 418  35   174  251  11 
9 DEF  2016-6-20 50   56   59   19   03 

我需要創建顏色的幾個時間序列圖(我可以非常容易地完成數據框架的構建)。

但是,我也希望能夠在特定日期(例如參見https://stanford.edu/~mwaskom/software/seaborn/examples/horizontal_barplot.html)中生成一個水平條形圖

例如,使用我的數據,截至2016年6月9日,在酒吧情節看起來如下(不按比例):

Black: ******************************** 

Yellow: ************************** 

White: *** 

Blue:  ** 

我遇到的問題是,列名(例如「黃色」,「藍色」,「白色」和「黑色」)可以改變,列數也可以改變。

是否有人知道是否有可能通過一定數量的列到'代碼'列的右邊循環,然後使用它們來創建類似於上面的水平條形圖?或者,也許可以在「代碼」列右側的數據中分一部分?或者,數據框本身是否需要以不同的方式進行構造,以便它可以用於製作時間序列圖和水平條形圖?

謝謝!

回答

0

在通過一定的列數的「代碼」欄的,我會做形式

for col in df.columns[3:]: 
    plot(col) 

然而,這只是作品的東西,如果你能保證正確的順序循環,你的列將始終按照相同的順序。或者,您可以確保該特定圖表的感興趣列以系統方式命名。

希望這會有所幫助!

0

IIUC你能做到這樣:

原DF:

In [127]: df 
Out[127]: 
    Company  Date Code Yellow Blue White Black 
0  ABC 2016-06-09 115  403 16  19 472 
1  ABC 2016-06-10 219  381 90  20 2474 
2  ABC 2016-06-11 817  21 31  88  54 
3  ABC 2016-06-12 80 2011 8888  0  21 
4  ABC 2016-06-13 21  15 46  20  56 
5  DEF 2016-06-16 64  42 76  4  41 
6  DEF 2016-06-17 694  13 84  50 986 
7  DEF 2016-06-18 325  485 38  60 174 
8  DEF 2016-06-19 418  35 174 251  11 
9  DEF 2016-06-20 50  56 59  19  3 

設置Date爲指數:

In [128]: df = df.set_index('Date') 

In [129]: df 
Out[129]: 
      Company Code Yellow Blue White Black 
Date 
2016-06-09  ABC 115  403 16  19 472 
2016-06-10  ABC 219  381 90  20 2474 
2016-06-11  ABC 817  21 31  88  54 
2016-06-12  ABC 80 2011 8888  0  21 
2016-06-13  ABC 21  15 46  20  56 
2016-06-16  DEF 64  42 76  4  41 
2016-06-17  DEF 694  13 84  50 986 
2016-06-18  DEF 325  485 38  60 174 
2016-06-19  DEF 418  35 174 251  11 
2016-06-20  DEF 50  56 59  19  3 

In [130]: cols = df.drop(['Company','Code'], 1).columns.tolist() 

In [131]: cols 
Out[131]: ['Yellow', 'Blue', 'White', 'Black'] 

In [139]: %paste 
import matplotlib 
matplotlib.style.use('ggplot') 

In [140]: df.ix['2016-06-09', cols].plot.barh(rot=0, color=cols) 
Out[140]: <matplotlib.axes._subplots.AxesSubplot at 0x1890a898> 

enter image description here

,或者如果你想情節排序:

In [142]: srt = df.ix['2016-06-09', cols].sort_values() 

In [143]: srt.plot.barh(color=srt.index) 
Out[143]: <matplotlib.axes._subplots.AxesSubplot at 0x1cf16748> 

enter image description here