2016-10-10 123 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