[英]Horizontal Bar Chart on Pandas Data Frame with Dynamic Column Names
我有以下源數據(來自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]}"
我使用“ 如何從Pandas數據框(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: **
我遇到的問題是列名(例如“黃色”,“藍色”,“白色”和“黑色”)可以更改,列數也可以更改。
有誰知道是否可以遍歷“代碼”列右側的一定數量的列,然后使用這些列創建類似於上述內容的水平條形圖? 還是在“代碼”列的右側獲取一部分數據?
或者,數據框本身是否需要采用不同的結構,以便可以用來制作時間序列圖和水平條形圖?
謝謝!
為了在“代碼”列的右側遍歷一定數量的列,我將采取以下形式
for col in df.columns[3:]:
plot(col)
但是,這僅在您可以保證您的列始終保持相同順序時才有效。 另外,您可以確保特定圖表的關注列以系統的方式命名。
希望這可以幫助!
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>
或如果要繪圖則排序:
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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.