本文完整代碼及數據已上傳至我的
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
倉庫中對應找到。
以上就是本文的全部內容,歡迎在評論區與我進行交流討論~