本文完整程式碼及資料已上傳至我的
Github
倉庫https://github.com/CNFeffery/FefferyViz
1 簡介
最近幾個月一是工作繁忙,二是將業餘的注意力多數放在Dash
系列教程的撰寫上,因此費老師我已經很久很久沒有更新過在模仿中精進資料視覺化系列文章了?,今天繼續第9期~
我們今天要繪製的資料視覺化作品,靈感來源於DT財經某篇文章的一幅插圖,原圖如下:
這幅圖其實可以說是柱狀蝴蝶圖的一種變種,用極座標系代替平面座標系,左上和右下彼此分離相對的半圓均以逆時針方向對資料排行進行帶色彩對映的視覺化,非常的美觀,容易給人留下深刻的印象。
而今天的文章我們換個資料來源,基於近3個月股票型以及債券型基金各自漲幅的前十名資料(資料來源東方財富網),來基於matplotlib
使用同樣的方式進行表達。
2 復刻過程
2.1 拆解主要視覺元素
其實這幅作品繪製起來主要的難度在於極座標系下很多matplotlib
涉及到的API
都比較冷門,如果是對matplotlib
不太熟悉的朋友可能會感覺無從下手。
按照慣例,我們先來“肢解”一下這幅圖的主要構圖元素:
- 分離的兩部分半圓區域
這幅作品中的主體區域當數左上及右下區域對應的兩個半圓,它們之間是存在一定寬度的間隔,因此我們需要建立兩個極座標系子圖,並調整位置,形成彼此相對的樣子,我們可以先使用plt.subplots()
開闢畫布,再針對畫布對應Figure
物件執行add_axes()
方法調整位置,插入polar=True
的極座標子圖。
再配合set_xlim()
、set_ylim()
,以及極座標系子圖專有的set_thetagrids()
、set_rgrids
和set_theta_offset()
來完成限定圓形顯示的角度範圍、半徑範圍,自定義網格線以及修改旋轉角度等作用,這一步後形成圖2:
- 利用fill_between()來對映資料
接下來我們就需要將資料對映到極座標系中,可以選擇柱狀圖或面積填充的方式進行繪製,我這裡為了操作自由度更高,選擇配合fill_between()
來基於面積填充進行對映(調色盤方案基於palettable
),因為是極座標系,所以對應傳入的引數變成了角度範圍和半徑序列,配合一些額外線條和白色填充後,效果如下:
- 文字標註
因為我們的基金資料中,基金的名稱普遍較長,且我還希望標註出每個扇形區域對應的漲幅數額,因此我使用環繞型的文字標註方式,基於matplotlib
的text()
方法,結合每個扇形區域的對應角度範圍,在迴圈過程中推匯出標註文字的旋轉角度,這一步後得到的效果如下:
這一步需要注意的是,matplotlib
中text()
在旋轉時,其針對水平和豎直方向對齊方式,在極座標系中有些要注意的地方,我在上圖中設定了引數rotation_mode='anchor'
,它幫助我們先旋轉文字,再對齊,如果不加這個引數,會先對齊再旋轉,得到的效果會很混亂:
2.2 完成復刻
在上述拆解的基礎上,加上一些對細節的補充,便得到下面的作品:
完整資料及程式碼你可以在文章開頭的Github
倉庫中對應找到。
以上就是本文的全部內容,歡迎在評論區與我進行交流討論~