怎么用Python绘制这样的图?
我是小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绘制这样的图?相关推荐
- python画动图-Python绘制动态水球图过程详解
先来看看绘制的动态水球图: 没有安装PyEcharts的,先安装PyEcharts: # 安装pyecharts模块,直接安装就是最新的版本pip install pyecharts 安装好PyEch ...
- python画折线图显示点值-Python 绘制可视化折线图
1. 用 Numpy ndarray 作为数据传入 ply import numpy as np import matplotlib as mpl import matplotlib.pyplot a ...
- python画折线图代码-python绘制简单折线图代码示例
1.画最简单的直线图 代码如下: import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] plt.figure() plt ...
- python绘制雷达图代码实例-使用python绘制温度变化雷达图
本文实例为大家分享了python绘制温度变化雷达图的具体代码,供大家参考,具体内容如下 假设某天某地每三个小时取样的气温为 针对温度变化趋势绘制雷达图: 代码如下: import numpy as n ...
- python画折线图详解-python绘制简单折线图代码示例
1.画最简单的直线图 代码如下: import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] plt.figure() plt ...
- python台风动图绘制_使用Python绘制台风轨迹图的示例代码
参考: 使用CMA热带气旋最佳路径数据集,对我国周边的台风进行绘制 import re import os import numpy as np import matplotlib.pyplot as ...
- python画折线图代码实现_python如何绘制分布折线图 python绘制分布折线图代码示例...
python如何绘制分布折线图?本篇文章小编给大家分享一下python绘制分布折线图代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 用Pyth ...
- python能画k线图吗_,求教使用python绘制K线图
如何用python实现视频关键帧提取并保存为图片 import cv2 vc = cv2.VideoCapture('Test.avi') #读入视频文件 c=1 if vc.isOpened(): ...
- python画简单图-python绘制简单彩虹图
本文实例为大家分享了python绘制彩虹图的具体代码,供大家参考,具体内容如下 代码: from turtle import * #控制彩虹路径 def path(pen, r, g, b): pen ...
- python画折线图-python绘制简单折线图代码示例
1.画最简单的直线图 代码如下: import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] plt.figure() plt ...
最新文章
- Lidar激光雷达与Radar雷达
- easyui相关解释
- Tomcat禁用SSLv3和RC4算法
- 严重: StandardServer.await: create[8005]:
- Java简介、安装及一些注意事项
- c语言如何赋值星期到字母,C语言程序设计课程教案.doc
- 解决Error #15: Initializing libiomp5.dylib, but found libomp.dylib already initialized.
- 离线环境下安装pyhanlp
- springboot jar包运行中获取资源文件
- linux shell 特殊符号的表示
- 深度学习的研究方向: 你会为AI转型么?
- x264_param_default分析
- 使用JAVA基础语法做一个简易的发票管理系统
- java计算机毕业设计企业固定资产管理系统源码+系统+数据库+lw文档+mybatis+运行部署
- 【Docker学习笔记 七】深入理解Docker网络配置及微服务部署
- 【异常】Reason: Executor heartbeat timed out after 140927 ms
- K8S的节点报 “NotReady”错误
- 转:让员工的信念跟上组织的发展
- 配置聚合连接 和 配置firewalld防火墙
- XP系统outlook选什么服务器,xp系统安装outlook的修复教程
热门文章
- Android 彻底删除、粉碎文件命令shred
- chm制作及Haroopad使用(makedown工具)
- 攒机的“三大忌律 八项注意”
- asd 商品历史价格查询
- 北京华客服务器数据恢复中心怎么样,北京修复数据
- 黑莓9900/9930的微信扫一扫功能
- c++windows openSSL编译(ActivePerl-5.28.msi+openssl-1.1.1k)
- Studio One6完整兼容版音频数字音乐工作站DAW
- 华为鸿蒙最大合作伙伴,全球第三大手机系统「鸿蒙」上线,这19款能抢先用…...
- Hibernate JPA-原生查询返回BigIntegers而不是long