最近看到一張圖,感覺很酷炫,搜索得知是叫做弦圖。看到很多用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
姓名王者曙光吃雞原神金鏟鏟扎金花小明20015101217才哥11180115小華10914284小青18412368小天179134126我們需要將寬表變為窄表(如果你就是窄表,則不需要這麼操作)
data = df.melt(id_vars=['姓名'],
value_vars=['王者', '曙光', '吃雞', '原神', '金鏟鏟', '扎金花']
)
data.head()
姓名variablevalue0小明王者201才哥王者112小華王者103小青王者184小天王者17用於繪製弦的數據已經有了:
接下來,我們搞定 圓上的對象(點)
node = pd.DataFrame(data['姓名'].append(data['variable']).unique(),
columns=['節點']
)
node
節點0小明1才哥2小華3小青4小天5王者6曙光7吃雞8原神9金鏟鏟10扎金花最終,對象節點數據如下:
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等等)
以上就是本次全部內容,相信大家也可以做出酷炫的弦圖了!
- EOF -
覺得本文有幫助?請分享給更多人
推薦關注「算法愛好者」,修煉編程內功
點讚和在看就是最大的支持❤️