怎麼用 Python 繪製這樣的圖?

2022-01-03 算法愛好者

最近看到一張圖,感覺很酷炫,搜索得知是叫做弦圖。看到很多用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 -

覺得本文有幫助?請分享給更多人

推薦關注「算法愛好者」,修煉編程內功

點讚和在看就是最大的支持❤️

相關焦點

  • python 基於opencv 繪製圖像輪廓
    這篇文章主要介紹了python 基於opencv 繪製圖像輪廓的示例,幫助大家更好的利用python的opencv庫處理圖像,感興趣的朋友可以了解下
  • Python|| proplot 中國地圖白化繪製
    看過很多大佬繪製過中國地圖,有R-ggplot[1]的,也有python-geopandas[2]等,還有其他cartopy等的作圖包,我就不一一舉例了
  • python使用matplotlib畫動態圖
    matplotlib是python的核心繪圖庫,是python的一個開源項目,旨在為python提供一個繪圖庫。matplotlib與numpy組合是一種可行的matlab替代方案。下面我們就來聊一聊如何使用matplotlib繪製一個二維動態圖。
  • 新一線城市競爭力盤點,用Python繪製動態圖帶你看懂!
    今天我們就來用數據全面解讀這15座城市。這次我們使用Python的動態可視化庫plotly,對這15座城市從2000年到2019年這20年的GDP、人口以及房價數據進行了可視化。下面就讓我們來一起看看吧!
  • 手把手教你用 Origin 繪製小提琴圖
    在統計圖像裡面,小提琴圖算是比較漂亮的一種圖形了。
  • 用 Python 繪製汙染物玫瑰圖
    為了更好地說明白風向玫瑰圖這個學術化的名詞我從百度百科找到了關於它的相關介紹,具體如下:風向玫瑰圖(簡稱風玫瑰圖)也叫風向頻率玫瑰圖,它是根據某一地區多年平均統計的各個風向和風速的百分數值,並按一定比例繪製,一般多用8個或16個羅盤方位表示,由於形狀酷似玫瑰花朵而得名。
  • Python數據可視化:氣泡圖的3種畫法
    ,Matplotlib用ax.scatter畫散點圖。10*a+20*b, 2), c=np.random.rand(100),cmap=mpl.cm.RdYlBu, marker="o")plt.show() Bokeh繪製氣泡圖
  • 還在煩惱用python在同一圖裡畫多數據曲線嗎?教你6種姿勢搞定
    概要:python的matplotlib作圖很強大,本文教你用6種不同方式解決將多種數據曲線畫到一起。問題:今天,老闆又要一個數據報表,小明選擇用 python來實現。「用matplotlib用來可視化。並且必須用不同顏色標誌每個數據曲線,曲線這些顏色也應該在Python裡自動選擇。」
  • 用Python製作一個貓咪小秒表
    要實現這樣的效果,用python就足夠了。主要用到的就是matplotlib包。首先,下載貓咪的gif圖,然後將gif圖切分成多張png圖。)原始的gif是這樣的:每一幀都用一張上文生成的不同的png圖片,遍歷完png圖片之後,再繼續循環往復。不難看出,原始gif中的貓耳朵是向左的,如果改成向上的,看著要舒服一些。這就需要將圖片沿著斜45度角進行旋轉。
  • Python學習筆記:繪製虛線圖和認識線的類型
    1.自己設定的虛線圖import numpy as npimport matplotlib.pyplot as plt#x軸數值區間是0到10,800個點x=np.linspace(0,10,800)#設置接下來將要繪製的曲線的點參數# 20個點出現,5個點隱藏,50個點出現,20個點隱藏(感覺可以設置自己想要的虛線)dashes=[20,5,50,20]#繪製圖紙
  • Python繪製地圖神器,上手直接開大!
    所以想要繪製更精美的可視化地圖?想在地圖上自由的設置各種參數?想獲得靈活的交互體驗?今天它就來了,Python繪製地圖神器folium,上手直接開大!Folium可以讓你用 Python 強大生態系統來處理數據,然後用 Leaflet 地圖來展示。Folium內置一些來自 OpenStreetMap、MapQuest Open、MapQuest Open Aerial、Mapbox和Stamen 的地圖元件(tilesets),並且支持用 Mapbox 或者 Cloudmade API keys 來自定義地圖元件。
  • 基於Python生成鉛筆素描圖
    >爬蟲技術分析代碼解析後記前言說到鉛筆素描,很多畫家用它用的極為精湛。有的細緻到跟照片無法區別,簡直是墨筆丹青,如行雲流水繞素箋,展瀚海崇山依舊顏,怎一個好字了得;但是有的人畫素描怎麼花都畫不好。那麼同一根鉛筆,為啥差距這麼大呢?今天阿廣給大家介紹一種使用PIL庫對原畫自動生成素描畫。思考彩色圖像和鉛筆素描對比
  • 不再羨慕別人的漂亮圖表,一文學會如何用Python繪製堆積圖
    首先,用matplotlib庫的bar()函數繪製堆積柱狀圖哦bar()函數作為matplotlib庫的專用柱狀圖繪製函數,相信大家已經熟悉它的調用方式了哦,現在咱們就看看如何繪製堆積柱狀圖吧!好啦,說完了堆積柱狀圖,咱們再深入聊一點,來看一下堆積柱狀圖的變體吧,如何繪製堆積條形圖哦!
  • 一文學會用Python繪製經典的棉棒圖、箱線圖和誤差棒圖
    這幾天一直在和大家聊Python數據可視化相關的東東,其中呢,介紹最多的當然是matplotlib庫中的各種繪製函數啦,上次已經和大家談論了關於Python中如何繪製氣泡圖等漂亮圖表的方式,今天呢,咱們繼續聊哦,今天呢,咱們就來聊聊如何繪製經典的棉棒圖、箱線圖和誤差棒圖
  • 非分裂式餅圖你會繪製嗎?一文學會如何用Python搞定
    ()函數來繪製分裂式餅圖,今天呢,咱們繼續深入介紹一下餅圖的繪製!那今天咱們來介紹餅圖的那些內容呢?就來說一下如何繪製非分裂式餅圖吧!其實在Python中繪製非分裂式餅圖與上次咱們介紹的繪製分裂式餅圖用的是同一個函數,依然是pie()函數,唯一的區別只是pie()函數中的參數設置不同!
  • 統計圖形自己就可搞定,一文學會用Python繪製經典餅圖
    餅圖,應該是大家比較熟悉的圖形了吧,作為用來展示定性數據比例分布特徵的經典統計圖形,通過餅圖,你可以很直觀地看到各組數據的佔比情況哦,上次已經和大家探討了如何用Python來繪製經典的階梯圖,今天呢,咱們繼續深入聊聊哦,看看在Python中如何繪製更為經典和常用的餅圖
  • python圖像處理-gif動圖
    前言相信很多人都有看過動圖,玩過一些小遊戲或者看過定格動畫,可能你很好奇,它們都是怎麼做出來的,其中的原理主要還是利用人的人眼暫留效應,簡單點來說,就是人看過一張圖片後,你把圖片拿走後,眼睛裡還是會短暫的保留一段時間,在這個期間內你在看另外一張圖片
  • Python-matplotlib 多子圖共用colorbar
    matplotlib 繪製教程後,有小夥伴反應能否出一篇多子圖共用一個colorbar的系列教程,這裡也就使用自己的數據進行繪製(數據一共四列,具體為真實值和使用三個模型計算的預測值)。在繪製多子圖共用colorbar時,最重要的就是對顏色映射進行設置,這裡使用了matplotlib.color.Normalize()進行顏色和數值對應設置。先看一下使用默認設置的結果,每個子圖對應一個colorbar。
  • 用Python畫朵玫瑰,只要五分鐘
    最近一個項目在用python,想著這次不用java了,用python給媽媽個禮物吧。Turtle庫是Python語言中一個非常強大的繪製圖像的函數庫,她提供了很多強大的方法,可以方便快速的繪圖,今天我們就來試一下,畫朵玫瑰送給媽媽。首先大家可以先去了解下turtle的具體用法,半小時就可上手,具體可以參考我之前的文章輕鬆搞定Python繪圖,就是這麼簡單。
  • 3分鐘快速了解python語法規則,寫第一個python程序
    今天的內容是,使用python的turtle模塊寫一個簡單程序,學習python程序的基本語法規則,以及如何使用模塊下面,看一個寫好的程序,然後分析下python的語法結構這個程序的功能,是在python shell控制臺輸入一個名字,如果名字是 『派僧』 的話,就讓小海龜繪製一條直線