入口流量分布可视化_韦恩图
- 前言
- 1、实现venn图方法介绍(基于python)
- 1.1基于matplotlib_venn的venn图实现
- (1)venn2实现(2组venn)
- (2)举个3组venn的应用例子(是实现方式同venn2)
- 1.2 基于pyvenn的venn图实现
- 2、写在后面
- 参考
前言
文氏图(英语:Venn diagram),或译Venn图、温氏图、维恩图、范氏图,是在所谓的集合论(或者类的理论)数学分支中,在不太严格的意义下用以表示集合(或类)的一种草图。它们用于展示在不同的事物群组(集合)之间的数学或逻辑联系,尤其适合用来表示集合(或)类之间的“大致关系” --百度百科
在实际业务中,往往需要多某个功能的流量入口分布做监控,这其中将流量分布直观的展现出来的可视化方式之一便是韦恩图,本文主要通过python的中matplotlib_venn与pyvenn两个第三方库来实现2-6组的韦恩图,并举一个简单(瞎编)的案例进行实现,不足之处,望多多指正。
1、实现venn图方法介绍(基于python)
本文主要介绍的实现venn图方式主要为以下两种:
- matplotlib_venn :可以实现2-3组形式的venn,开源的git地址:https://github.com/konstantint/matplotlib-venn
- pyvenn:可实现2-6组形式的venn,开源的git地址:https://github.com/tctianchi/pyvenn
1.1基于matplotlib_venn的venn图实现
(1)venn2实现(2组venn)
matplotlib_venn的主要构成:
matplotlib_venn.venn2(subsets, set_labels, set_colors, alpha, normalize_to, ax, subset_label_formatter)
各元素含义为:
- subsets #venn图数据集
- set_labels #集合图命名
- set_colors #集合颜色
- alpha #透明度
- normalize_to #venn图占据figure的比例,1.0占满
其中subset的数据接受格式主要有以下几种:
- 列表为list(集合A,集合B)
- 元祖tuple(集合A,集合B)
- 字典dict(A独有,B独有,AB共有)
- 元祖tuple(A有,B有,AB共有)
- 列表为list(A有,B有,AB共有)
实现源码如下:
# subsets参数为绘图的数据集,接受的数据的5种方式如下:
subset=[[{1,2,3},{1,2,4}], #列表为list(集合1,集合2)
({1,2,3},{1,2,4}), #元祖tuple(集合1,集合2)
{'01':1,'10':1,'11':2},#字典dict(A独有,B独有,AB共有)
(3,3,2), #元祖tuple(A有,B有,AB共有)
[3,3,2], #列表为list(A有,B有,AB共有)
]
for i in subset:
r=100
plt.figure(figsize = (500/r,500/r),dpi=r) #设置图的尺寸,控制分辨率
g=venn2(subsets = i, #venn图数据集
set_labels = ('A','B'), #集合图命名
set_colors=('g','r'), #集合颜色
alpha=0.6, #透明度
normalize_to=1.0 #venn图占据figure的比例,1.0占满
)
plt.title('subset=%s'%str(i))
plt.show()
(2)举个3组venn的应用例子(是实现方式同venn2)
举一个实际的业务应用例子,某个功能点有入口A、B、C个入口,需要知道该功能的流量在ABC三入口的流量分布直观的可视化图像(具体数据如下:)
应用代码如下:
# 举一个实际的业务应用例子,某个功能点有入口A、B、C个入口,需要知道该功能的流量在ABC三口的流量分布
#调库
from matplotlib import pyplot as plt
from matplotlib_venn import venn3,venn3_circles
r=100
plt.figure(figsize = (500/r,500/r),dpi=r) #设置图的尺寸,控制分辨率
g=venn3(subsets = {'111':183512,'011':72296,'101':8692,'110':175434,'001':693358
,'010':138673,'100':1219479}, #venn图数据集
set_labels = ('A','B','C'), #集合图命名
set_colors=('g','r','y'), #集合颜色
alpha=0.6, #透明度
normalize_to=1.0 #venn图占据figure的比例,1.0占满
)
plt.title('flow')
plt.show()
1.2 基于pyvenn的venn图实现
pyvenn库为基于原有的matplotlib二次开发得来(笔者yy是原有的venn可实现的venn组数太少,因此有大佬将此进行二次开发,得到这个库);
笔者把玩的时间不多,初步感觉其与venn实现的方式大同小异,需要注意的在git中下好pyvenn项目后注意放到自己python原有的引用库文件夹中,调用其中的venn.py文件进行相关的编程实现
举个例子:某个功能点有入口A、B、C、D个入口,需要知道该功能的流量在ABCD三入口的流量分布直观的可视化图像(数据源自瞎编),基于pyvenn实现为:
# 解决中文乱码问题
plt.rcParams["font.sans-serif"]='SimHei'
fig, ax = venn.venn4({'0001': 697, '0010':1336, '0011': 799, '0100':68,
'0101':11, '0110': 4767, '0111':1697, '1000':1848,
'1001': 7812, '1010':145, '1011':144, '1100':31,
'1101': 75, '1110':39, '1111': 3268}
, names=['A','B','C','D'])
plt.title('xx功能流量来源分布')
fig.show()
2、写在后面
学到这里,基本满足了笔者将其运用到业务里的需求,同时仍有不足与问题如下:也欢迎大佬读者多多赐教:
- pyvenn的相关图像配置参数拿捏不足,图像可能还能更加美观;
- pyvenn目前实现的venn4的图块面积不会随着参数的大小而变化(暂时不知道是笔者没学深入,还是这个库的一个小缺陷)