(在模仿中精進數據可視化09)近期基金漲幅排行可視化

本文完整程式碼及數據已上傳至我的Github倉庫//github.com/CNFeffery/FefferyViz

1 簡介

  最近幾個月一是工作繁忙,二是將業餘的注意力多數放在Dash系列教程的撰寫上,因此費老師我已經很久很久沒有更新過在模仿中精進數據可視化系列文章了😶,今天繼續第9期~

  我們今天要繪製的數據可視化作品,靈感來源於DT財經某篇文章的一幅插圖,原圖如下:

圖1

  這幅圖其實可以說是柱狀蝴蝶圖的一種變種,用極坐標系代替平面坐標系,左上和右下彼此分離相對的半圓均以逆時針方向對數據排行進行帶色彩映射的可視化,非常的美觀,容易給人留下深刻的印象。

  而今天的文章我們換個數據源,基於近3個月股票型以及債券型基金各自漲幅的前十名數據(數據來源東方財富網),來基於matplotlib使用同樣的方式進行表達。

2 復刻過程

2.1 拆解主要視覺元素

  其實這幅作品繪製起來主要的難度在於極坐標系下很多matplotlib涉及到的API都比較冷門,如果是對matplotlib不太熟悉的朋友可能會感覺無從下手。

  按照慣例,我們先來「肢解」一下這幅圖的主要構圖元素:

  • 分離的兩部分半圓區域

  這幅作品中的主體區域當數左上及右下區域對應的兩個半圓,它們之間是存在一定寬度的間隔,因此我們需要創建兩個極坐標系子圖,並調整位置,形成彼此相對的樣子,我們可以先使用plt.subplots()開闢畫布,再針對畫布對應Figure對象執行add_axes()方法調整位置,插入polar=True的極坐標子圖。

  再配合set_xlim()set_ylim(),以及極坐標系子圖專有的set_thetagrids()set_rgridsset_theta_offset()來完成限定圓形顯示的角度範圍、半徑範圍,自定義網格線以及修改旋轉角度等作用,這一步後形成圖2:

圖2

  • 利用fill_between()來映射數據

  接下來我們就需要將數據映射到極坐標系中,可以選擇柱狀圖面積填充的方式進行繪製,我這裡為了操作自由度更高,選擇配合fill_between()來基於面積填充進行映射(調色盤方案基於palettable),因為是極坐標系,所以對應傳入的參數變成了角度範圍和半徑序列,配合一些額外線條和白色填充後,效果如下:

圖3

  • 文字標註

  因為我們的基金數據中,基金的名稱普遍較長,且我還希望標註出每個扇形區域對應的漲幅數額,因此我使用環繞型的文字標註方式,基於matplotlibtext()方法,結合每個扇形區域的對應角度範圍,在循環過程中推導出標註文字的旋轉角度,這一步後得到的效果如下:

圖4

  這一步需要注意的是,matplotlibtext()在旋轉時,其針對水平和豎直方向對齊方式,在極坐標系中有些要注意的地方,我在上圖中設置了參數rotation_mode='anchor',它幫助我們先旋轉文字,再對齊,如果不加這個參數,會先對齊再旋轉,得到的效果會很混亂:

圖5

2.2 完成復刻

  在上述拆解的基礎上,加上一些對細節的補充,便得到下面的作品:

圖6

  完整數據及程式碼你可以在文章開頭的Github倉庫中對應找到。

  以上就是本文的全部內容,歡迎在評論區與我進行交流討論~