我是小z

最近看到一张图,感觉很酷炫,搜索得知是叫做弦图。看到很多用R语言绘制的案例,以及有Excel大佬用VBA也绘制了一个,简直不要太强。

那么,Python可以绘制吗?找了一圈发现有一个付费的第三方包可以实现,因为需要付费,这里就不介绍了。最终,可算让我找到了Python绘制的免费方案,今天我们就一起来看看吧!

1. 什么是弦图

下面这张图就是弦图,主要用于展示多个对象之间的关系,连接在圆上任意两点之间的线段叫做弦。

来源:网络

对于弦图,有以下特点:

  • 用不同颜色区分不同的对象(点)

  • 圆上的两点之间的弦表示之间存在关系

  • 弦的宽度表示关系程度,关系越明显则弦宽越宽

  • 因为不同对象颜色不同,可以通过两点之间弦的颜色区分是对象->对象的方向

一般来说,弦图可以用于以下几种场景:

  • 人口迁徙(不同城市之间迁入迁出)

  • 电竞战队或球队之间选手交易

  • 具有重叠成分的不同成品与各成分关系

  • 类似以上几类场景的情况等等

今天,我们绘制弦图要用到的可视化库是holoviews

2. 弦图绘制

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 pddf = pd.read_clipboard()
df
姓名 王者 曙光 吃鸡 原神 金铲铲 扎金花
小明 20 0 15 10 12 17
才哥 11 1 8 0 11 5
小华 10 9 14 2 8 4
小青 18 4 12 3 6 8
小天 17 9 13 4 12 6

我们需要将宽表变为窄表(如果你就是窄表,则不需要这么操作)

data = df.melt(id_vars=['姓名'], value_vars=['王者', '曙光', '吃鸡', '原神', '金铲铲', '扎金花'])
data.head()
姓名 variable value
0 小明 王者 20
1 才哥 王者 11
2 小华 王者 10
3 小青 王者 18
4 小天 王者 17

用于绘制弦的数据已经有了:

  • 弦的方向就是姓名->variable

  • 弦的宽度就是value

接下来,我们搞定 圆上的对象(点)

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等等)

以上就是本次全部内容,相信大家也可以做出酷炫的弦图了!

●Graveyard分析模型是真的牛X!●品牌知名度分析实例

怎么用Python绘制这样的图?相关推荐

  1. python画动图-Python绘制动态水球图过程详解

    先来看看绘制的动态水球图: 没有安装PyEcharts的,先安装PyEcharts: # 安装pyecharts模块,直接安装就是最新的版本pip install pyecharts 安装好PyEch ...

  2. python画折线图显示点值-Python 绘制可视化折线图

    1. 用 Numpy ndarray 作为数据传入 ply import numpy as np import matplotlib as mpl import matplotlib.pyplot a ...

  3. python画折线图代码-python绘制简单折线图代码示例

    1.画最简单的直线图 代码如下: import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] plt.figure() plt ...

  4. python绘制雷达图代码实例-使用python绘制温度变化雷达图

    本文实例为大家分享了python绘制温度变化雷达图的具体代码,供大家参考,具体内容如下 假设某天某地每三个小时取样的气温为 针对温度变化趋势绘制雷达图: 代码如下: import numpy as n ...

  5. python画折线图详解-python绘制简单折线图代码示例

    1.画最简单的直线图 代码如下: import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] plt.figure() plt ...

  6. python台风动图绘制_使用Python绘制台风轨迹图的示例代码

    参考: 使用CMA热带气旋最佳路径数据集,对我国周边的台风进行绘制 import re import os import numpy as np import matplotlib.pyplot as ...

  7. python画折线图代码实现_python如何绘制分布折线图 python绘制分布折线图代码示例...

    python如何绘制分布折线图?本篇文章小编给大家分享一下python绘制分布折线图代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 用Pyth ...

  8. python能画k线图吗_,求教使用python绘制K线图

    如何用python实现视频关键帧提取并保存为图片 import cv2 vc = cv2.VideoCapture('Test.avi') #读入视频文件 c=1 if vc.isOpened(): ...

  9. python画简单图-python绘制简单彩虹图

    本文实例为大家分享了python绘制彩虹图的具体代码,供大家参考,具体内容如下 代码: from turtle import * #控制彩虹路径 def path(pen, r, g, b): pen ...

  10. python画折线图-python绘制简单折线图代码示例

    1.画最简单的直线图 代码如下: import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] plt.figure() plt ...

最新文章

  1. 使用leangoo做多团队敏捷开发项目管理
  2. 计算机书籍-老年人编程自学书籍
  3. python爬虫自学笔记分析解密_Python爬虫自学系列(七) -- 项目实战篇(一)
  4. SAP SD基础知识之组织架构设计-Shipping Point篇
  5. [Android]使用platform密钥来给apk文件签名的命令
  6. 变异系数法之matlab
  7. liteide无法自动补全代码问题解决【go: cannot find GOROOT directory: c:\go】
  8. UI设计摘要背景素材|简单分层PSD格式化模板,为项目增加背景
  9. EMC NetWorker简单管理指南(二)
  10. Java中abstract关键字详解
  11. Caused by: java.lang.SecurityException: com.example.geofences from uid 10049 not allowed to perform
  12. 高中分班考试如何计算机,新高一生如何应对分班考?
  13. DPDK-l3fwd示例IPv6测试
  14. websocket 实现长连接原理
  15. 本地缓存之王-Caffeine
  16. vr全景展示是什么?vr全景展示有哪些实际功能!
  17. 为什么成年人都不学习了
  18. 本地部署你的专属ChatGPT,不用想方设法翻墙了
  19. 认证失败,严重错误:无法连接到服务器
  20. Linux的20个常用命令

热门文章

  1. VIRTUALBOX 虚拟机安装 OS X 10.9 MAVERICKS
  2. Vue开发问题记录:expected indentation of 0 spaces but found 2
  3. 产品经理和程序员之间的选择?
  4. 内部表外部表的操作与区别
  5. c语言学习宝典老版,C语言学习宝典APP最新版下载_C语言学习宝典APP官方版5.6.7下载_QQ下载站...
  6. 超详细MapReduce程序实现WordCount案例
  7. 联想X3650M5 无法引导系统的问题
  8. 漫漫人生路,悠悠岁月深。最快的脚步不是跨越,而是继续;
  9. JAVA毕业设计家教管理系统计算机源码+lw文档+系统+调试部署+数据库
  10. 【极简版GH60】【GH60剖析】【八】增加一键输入密码(邮箱)功能