5行Python代碼就能實現刷爆全網的動態條形圖!非常直觀了
原標題:5行Python代碼就能實現刷爆全網的動態條形圖!非常直觀了
說起動態圖表,最火的莫過於動態條形圖了。
在B站上搜索「數據可視化」這個關鍵詞,可以看到很多與動態條形圖相關的視頻。
好多視頻都達到了上百萬的播放量,屬實厲害。
目前網上實現動態條形圖現成的工具也很多。
比如數可視的「花火hanabi」,嫡數的「鏑數圖表」,以及國外網站「Flourish」。
但是作爲一名Pythoner,當然是想要研究一下如何用Python來實現。
之前也看過大佬們通過Matplotlib、Plotly、Pyecharts實現類似的功能,就是代碼量有點多,看的腦瓜疼。
所以最近發現到了一個庫「Bar Chart Race」,堪稱Python界最強的動態可視化包。
GitHub地址:
_https://github.com/dexplo/bar_chart_race_
文檔地址:
_https://www.dexplo.org/bar_chart_race/_
目前主要有0.1和0.2兩個版本,0.2版本添加動態曲線圖以及Plotly實現的動態條形圖。
庫是挺好的,就是在安裝上有點問題。
在PyCharm的Project Interpreter上只能安裝到0.1版本,功能不太全。
通過pip install bar_chart_race也只能到0.1版本。
最後我選擇將項目從GitHub上下載下來****,再進行安裝。
下載壓縮包,將解壓後的文件夾放置在項目的venv/lib/python3.7/site-packages目錄下。
在虛擬環境下打開文件夾,命令行運行如下命令完成安裝。
- cd 你的項目地址/venv/lib/python3.7/site-packages/bar_chart_race-master
- python setup.py install
- # 提示成功安裝
- # Finished processing dependencies for bar-chart-race==0.2.0
- 複製代碼
好了,安裝成功後就可以引入這個第三方庫。
- import bar_chart_race as bcr
- # 如果出現SSL錯誤,則全局取消證書驗證
- # import ssl
- # ssl._create_default_https_context = ssl._create_unverified_context
- # 獲取數據
- df = bcr.load_dataset('covid19_tutorial')# print(df)
- # 生成GIF圖像
- bcr.bar_chart_race(df, 'covid19_horiz.gif')
- 複製代碼
生成了一個GIF圖,具體如下。
3行代碼Python代碼就實現了,對大佬封裝好的庫表示膜拜~
這裏因爲作者封裝好了數據處理模塊,只需要3行代碼即可。
對於我們而言,是需要加載自己的數據,自己進行處理,所以多了那麼2行。
示例裏的數據直接使用作者提供的,在data文件夾下的covid19_tutorial.csv文件(GitHub上有)。
經過其封裝好的數據處理函數,得到最終的數據。
另外作者還提供了很多配置參數,供大家選擇。
01 動態條形圖變動態柱狀圖
- # orientation='v',生成柱狀圖
- bcr.bar_chart_race(df, 'covid19_horiz.gif', orientation='v')
- 複製代碼
02 排序方式,默認爲降序(desc)
- # 設置排序方式,asc-升序
- bcr.bar_chart_race(df, 'covid19_horiz.gif', sort='asc')
- 複製代碼
03 條目數限制,此處設置爲最多出現6條
- # 設置最多能顯示的條目數,6條
- bcr.bar_chart_race(df, 'covid19_horiz.gif', n_bars=6)
- 複製代碼
04 設置固定類目
- # 選取如下5個國家的數據
- bcr.bar_chart_race(df, 'covid19_horiz.gif', fixed_order=['Iran', 'USA', 'Italy', 'Spain', 'Belgium'])
- 複製代碼
05 固定數值軸,使其不發生動態變化
- # 設置數值的最大值,固定數值軸
- bcr.bar_chart_race(df, 'covid19_horiz.gif', fixed_max=True)
- 複製代碼
06 圖像幀數,默認10幀,此處設置爲3幀,可以發現圖像明顯變得有些卡頓
- # 圖像幀數。數值越小,越不流暢。越大,越流暢。
- bcr.bar_chart_race(df, 'covid19_horiz.gif', steps_per_period=3)
- 複製代碼
07 設置幀率,單位時間默認爲500ms
- # 設置20幀的總時間,此處爲200ms
- bcr.bar_chart_race(df, 'covid19_horiz.gif', steps_per_period=20, period_length=200)
- 複製代碼
08 設置每幀增加的標籤時間,默認爲False
- # 輸出MP4
- bcr.bar_chart_race(df, 'covid19_horiz.mp4', interpolate_period=True)
- 複製代碼
09 繪圖屬性設置
- # figsize-設置畫布大小,默認(6, 3.5)
- # dpi-圖像分辨率,默認144
- # label_bars-顯示柱狀圖的數值信息,默認爲True
- # period_label-顯示時間標籤信息,默認爲True
- # title-圖表標題
- bcr.bar_chart_race(df, 'covid19_horiz.gif', figsize=(5, 3), dpi=100, label_bars=False, period_label={'x': .99, 'y': .1, 'ha': 'right', 'color': 'red'}, title='COVID-19 Deaths by Country')
- 複製代碼
10 配置標籤文字大小
- # bar_label_size-柱狀圖標籤文字大小
- # tick_label_size-座標軸標籤文字大小
- # title_size-標題標籤文字大小
- bcr.bar_chart_race(df, 'covid19_horiz.gif', bar_label_size=4, tick_label_size=5, title='COVID-19 Deaths by Country', title_size='smaller')
- 複製代碼
11 全局文字屬性
- # shared_fontdict-全局字體屬性
- bcr.bar_chart_race(df, 'covid19_horiz.gif', title='COVID-19 Deaths by Country', shared_fontdict={'family': 'Helvetica', 'weight': 'bold', 'color': 'rebeccapurple'})
- 複製代碼
12 條形圖屬性,可以設置透明度,邊框等
- # bar_kwargs-條形圖屬性
- bcr.bar_chart_race(df, 'covid19_horiz.gif', bar_kwargs={'alpha': .2, 'ec': 'black', 'lw': 3})
- 複製代碼
13 設置日期標籤的時間格式
- # 設置日期格式,默認爲'%Y-%m-%d'
- bcr.bar_chart_race(df, 'covid19_horiz.gif', period_fmt='%b %-d, %Y')
- 複製代碼
14 更改日期標籤爲數值
- # 設置日期標籤爲數值
- bcr.bar_chart_race(df.reset_index(drop=True), 'covid19_horiz.gif', interpolate_period=True, period_fmt='Index value - {x:.2f}')
- 複製代碼
15 添加動態文本,此處爲數值總數統計
- # 設置文本位置、數值、大小、顏色等
- def summary(values, ranks):
- total_deaths = int(round(values.sum(), -2))
- s = f'Total Deaths - {total_deaths:,.0f}'
- return {'x': .99, 'y': .05, 's': s, 'ha': 'right', 'size': 8}
- # 添加文本
- bcr.bar_chart_race(df, 'covid19_horiz.gif', period_summary_func=summary)
- 複製代碼
16 添加垂直條,可選類型有平均值、分位數等
- # 設置垂直條數值,分位數
- def func(values, ranks):
- return values.quantile(.9)
- # 添加垂直條
- bcr.bar_chart_race(df, 'covid19_horiz.gif', perpendicular_bar_func=func)
- 複製代碼
17 設置柱狀圖顏色,默認爲dark24
- # 設置柱狀圖顏色
- bcr.bar_chart_race(df, 'covid19_horiz.gif', cmap='accent')
- 複製代碼
18 柱狀圖顏色不重複,上面這個圖是有重複顏色的
- # 去除重複顏色
- bcr.bar_chart_race(df, 'covid19_horiz.gif', cmap='accent', filter_column_colors=True)
- 複製代碼
這裏有一些要注意的地方,比如中文配置,以及自定義顏色配置。
中文配置只需在第三方庫的「_make_chart.py」文件中,加入如下三行代碼。
- #中文顯示
- plt.rcParams['font.sans-serif'] = ['SimHei']
- #Windows
- plt.rcParams['font.sans-serif'] = ['Hiragino Sans GB']
- #Mac
- plt.rcParams['axes.unicode_minus'] = False
- 複製代碼
現在在圖表中加入中文,來看看結果。
- import bar_chart_race as bcr
- import pandas as pd
- # 讀取數據
- df = pd.read_csv('yuhuanshui.csv', encoding='utf-8', header=0, names=['name', 'number', 'day'])
- # 處理數據
- df_result = pd.pivot_table(df, values='number', index=['day'], columns=['name'], fill_value=0)# print(df_result)
- # 生成圖像
- bcr.bar_chart_race(df_result, 'heat.gif', title='我是餘歡水演職人員熱度排行')
- 複製代碼
使用電視劇餘歡水人物的「百度指數」數據。
文件具體內容如下。
經過數據透視表處理後,得到與該庫格式相同的數據。
想用自己的數據來做動態條形圖,5行代碼****即可搞定。PS:如有需要Python學習資料的小夥伴可以加點擊下方鏈接自行獲取
python免費學習資料以及羣交流解答點擊即可加入
此外通過在「_colormaps.py」文件中添加顏色信息,經cmap引用,即可自定義配置顏色。
- colormaps = {"new_colors": ['#ff812c', '#ff5a5a', '#00c5d2', '#a64dff', '#4e70f0', '#f95dba', '#ffce2b']}
- 複製代碼
使用一波,看會不會變得好看一些。
- # 使用自定義的顏色列表
- bcr.bar_chart_race(df_result, 'heat.gif', title='我是餘歡水演職人員熱度排行', cmap='new_colors')
- 複製代碼
果然,看起來還不錯~
還有一些細節上的參數,大家可通過查看庫的源碼,來了解一二。
PS:如有需要Python學習資料的小夥伴可以加點擊下方鏈接自行獲取
python免費學習資料以及羣交流解答點擊即可加入 完整代碼點他獲取