怎麼用 Python 繪製弦圖?
大家好,我是才哥。
最近看到一張圖,感覺很酷炫,搜索得知是叫做弦圖。看到很多用R
語言繪製的案例,以及有Excel
大佬用VBA
也繪製了一個,簡直不要太強。
那麼,Python
可以繪製嗎?找了一圈發現有一個付費的第三方包可以實現,因爲需要付費,這裏就不介紹了。最終,可算讓我找到了Python
繪製的免費方案,今天我們就一起來看看吧!
- 什麼是弦圖
下面這張圖就是弦圖,主要用於展示多個對象之間的關係,連接在圓上任意兩點之間的線段叫做弦。
對於弦圖,有以下特點:
-
用不同顏色區分不同的對象(點)
-
圓上的兩點之間的弦表示之間存在關係
-
弦的寬度表示關係程度,關係越明顯則弦寬越寬
-
因爲不同對象顏色不同,可以通過兩點之間弦的顏色區分是對象 -> 對象的方向
一般來說,弦圖可以用於以下幾種場景:
-
人口遷徙(不同城市之間遷入遷出)
-
電競戰隊或球隊之間選手交易
-
具有重疊成分的不同成品與各成分關係
-
類似以上幾類場景的情況等等
今天,我們繪製弦圖要用到的可視化庫是holoviews
- 弦圖繪製
HoloViews 是一個開源的 Python 庫,可以用非常少的代碼行中完成數據分析和可視化,除了默認的 matplotlib 後端外,還添加了一個 Bokeh 後端。Bokeh 提供了一個強大的平臺,通過結合 Bokeh 提供的交互式小部件,可以使用 HTML5 canvas 和 WebGL 快速生成交互性和高維可視化,非常適合於數據的交互式探索。官網:http://holoviews.org/
首先,我們需要安裝第三方庫holoviews
pip install holoviews
我們先看看官方案例
import holoviews as hv
from holoviews import opts, dim
from bokeh.sampledata.airport_routes import routes, airports
# 選擇bokeh引擎
hv.extension('bokeh')
# Count the routes between Airports
route_counts = routes.groupby(['SourceID', 'DestinationID']).Stops.count().reset_index()
nodes = hv.Dataset(airports, 'AirportID','City')
chord = hv.Chord((route_counts, nodes), ['SourceID', 'DestinationID'], ['Stops'])
# Select the 6 busiest airports
busiest = list(routes.groupby('SourceID').count().sort_values('Stops').iloc[-6:].index.values)
busiest_airports = chord.select(AirportID=busiest, selection_mode='nodes')
busiest_airports.opts(
opts.Chord(cmap='Category20', edge_color=dim('SourceID').str(),
height=500,
labels='City',
node_color=dim('AirportID').str(), width=500))
弦圖
我們拿玩家在不同遊戲中的付費金額來繪製弦圖,演示每一個步驟
2.1 數據準備
用以下數據進行案例演示
import pandas as pd
df = pd.read_clipboard()
df
我們需要將寬表變爲窄表(如果你就是窄表,則不需要這麼操作)
data = df.melt(id_vars=['姓名'],
value_vars=['王者', '曙光', '喫雞', '原神', '金剷剷', '扎金花']
)
data.head()
用於繪製弦的數據已經有了:
-
弦的方向就是
姓名->variable
-
弦的寬度就是
value
接下來,我們搞定 圓上的對象(點)
node = pd.DataFrame(data['姓名'].append(data['variable']).unique(),
columns=['節點']
)
node
最終,對象節點數據如下:
nodes = hv.Dataset(node, '節點',)
搞定這些,我們就可以進行繪製了
2.2 繪製操作
chord = hv.Chord((route_counts, nodes),
['姓名', 'variable'], ['value'])
# 可選擇節點數
busiest = node['節點'].to_list()
busiest_airports = chord.select(AirportID=busiest, selection_mode='nodes')
busiest_airports.opts(
opts.Chord(cmap='Tab20', edge_color=dim('姓名').str(),
height=500,
width=500,
labels='節點',
node_color='節點',
edge_visible=True
))
最終,我們得到效果如下:
弦圖案例
這個弦圖是可以交互的,可以save本地html文件
。
hv.save(busiest_airports,r'output.html')
保存本地
其實,弦圖繪製還有很多參數,大家可以自己help
試試(比如背景顏色、字體大小、弦的顏色 cmap 等等)
以上就是本次全部內容,相信大家也可以做出酷炫的弦圖了!
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/8oqe7SxmvwABIhDHWJmhTw