入口流量分布可视化_韦恩图

  • 前言
  • 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图方式主要为以下两种:

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

python制作韦恩图 python 韦恩图_python制作韦恩图


python制作韦恩图 python 韦恩图_python制作韦恩图_02


python制作韦恩图 python 韦恩图_python_03


python制作韦恩图 python 韦恩图_python制作韦恩图_04


python制作韦恩图 python 韦恩图_数据集_05

(2)举个3组venn的应用例子(是实现方式同venn2)

举一个实际的业务应用例子,某个功能点有入口A、B、C个入口,需要知道该功能的流量在ABC三入口的流量分布直观的可视化图像(具体数据如下:)

python制作韦恩图 python 韦恩图_数据集_06


应用代码如下:

# 举一个实际的业务应用例子,某个功能点有入口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的图块面积不会随着参数的大小而变化(暂时不知道是笔者没学深入,还是这个库的一个小缺陷)