怎麼用 Python 繪製弦圖?

大家好,我是才哥。

最近看到一張圖,感覺很酷炫,搜索得知是叫做弦圖。看到很多用R語言繪製的案例,以及有Excel大佬用VBA也繪製了一個,簡直不要太強。

那麼,Python可以繪製嗎?找了一圈發現有一個付費的第三方包可以實現,因爲需要付費,這裏就不介紹了。最終,可算讓我找到了Python繪製的免費方案,今天我們就一起來看看吧!

  1. 什麼是弦圖

下面這張圖就是弦圖,主要用於展示多個對象之間的關係,連接在圓上任意兩點之間的線段叫做弦。

對於弦圖,有以下特點:

一般來說,弦圖可以用於以下幾種場景:

今天,我們繪製弦圖要用到的可視化庫是holoviews

  1. 弦圖繪製

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

rVo7SM

我們需要將寬表變爲窄表(如果你就是窄表,則不需要這麼操作)

data = df.melt(id_vars=['姓名'], 
               value_vars=['王者''曙光''喫雞''原神''金剷剷''扎金花']
              )
data.head()

bYELaA

用於繪製弦的數據已經有了:

接下來,我們搞定 圓上的對象(點)

node = pd.DataFrame(data['姓名'].append(data['variable']).unique(),
                    columns=['節點']
                   )
node

sAg6F2

最終,對象節點數據如下:

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