Python matplotlib可视化之绘制韦恩图


Posted in Python onFebruary 24, 2022

本文速览

2组数据venn

Python matplotlib可视化之绘制韦恩图

3组数据venn 

Python matplotlib可视化之绘制韦恩图

4组数据venn 

Python matplotlib可视化之绘制韦恩图

5组数据venn图

Python matplotlib可视化之绘制韦恩图

6组数据venn 

Python matplotlib可视化之绘制韦恩图

python中Matplotlib并没有现成的函数可直接绘制venn图, 不过已经有前辈基于matplotlib.patches及matplotlib.path开发了两个轮子:

matplotlib_venn【2~3组数据,比较多博客介绍】:https://github.com/konstantint/matplotlib-venn

pyvenn【2~6组数据】:https://github.com/tctianchi/pyvenn

1、 matplotlib_venn

该模块包含'venn2', 'venn2_circles',  'venn3', 'venn3_circles'四个关键函数,这里主要详细介绍'venn2','venn3'同理。

(1)2组数据venn图

matplotlib_venn.venn2(subsets, set_labels=('A', 'B'), set_colors=('r', 'g'), alpha=0.4, normalize_to=1.0, ax=None, subset_label_formatter=None)

绘图数据格式

subsets参数接收绘图数据集,以下5种方式均可以,注意细微异同。

#导入依赖packages
import matplotlib.pyplot as plt
from matplotlib_venn import venn2,venn2_circles#记得安装matplotlib_venn(pip install matplotlib_venn 或者conda install matplotlib_venn)
 
 
# subsets参数
#绘图数据的格式,以下5种方式均可以,注意异同
subset = [[{1,2,3},{1,2,4}],#列表list(集合1,集合2)
          ({1,2,3},{1,2,4}),#元组tuple(集合1,集合2)
          {'10': 1, '01': 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:
    my_dpi=100
    plt.figure(figsize=(500/my_dpi, 500/my_dpi), dpi=my_dpi)
    g=venn2(subsets=i)#默认数据绘制venn图,只需传入绘图数据
    plt.title('subsets=%s'%str(i))
    plt.show()

Python matplotlib可视化之绘制韦恩图

Python matplotlib可视化之绘制韦恩图

Python matplotlib可视化之绘制韦恩图

Python matplotlib可视化之绘制韦恩图

Python matplotlib可视化之绘制韦恩图

一些简单参数介绍 

my_dpi=150
plt.figure(figsize=(580/my_dpi, 580/my_dpi), dpi=my_dpi)#控制图尺寸的同时,使图高分辨率(高清)显示
g=venn2(subsets = [{1,2,3},{1,2,4}], #绘图数据集
        set_labels = ('Label 1', 'Label 2'), #设置组名
        set_colors=("#098154","#c72e29"),#设置圈的颜色,中间颜色不能修改
        alpha=0.6,#透明度
        normalize_to=1.0,#venn图占据figure的比例,1.0为占满
       )
plt.show()

Python matplotlib可视化之绘制韦恩图

所有圈外框属性设置 

my_dpi=150
plt.figure(figsize=(580/my_dpi, 580/my_dpi), dpi=my_dpi)
g=venn2(subsets = [{1,2,3},{1,2,4}],
        set_labels = ('Label 1', 'Label 2'),
        set_colors=("#098154","#c72e29"),
        alpha=0.6,
        normalize_to=1.0,
       )
g=venn2_circles(subsets = [{1,2,3},{1,2,4}], 
        linestyle='--', linewidth=0.8, color="black"#外框线型、线宽、颜色
       )
plt.show()

Python matplotlib可视化之绘制韦恩图

单个圈特性设置

g.get_patch_by_id('10')返回一个matplotlib.patches.PathPatch对象,有诸多参数可个性化修改 ,详细见matplotlib官网。

my_dpi=150
plt.figure(figsize=(550/my_dpi, 550/my_dpi), dpi=my_dpi)
 
g=venn2(subsets = [{1,2,3},{1,2,4}], 
        set_labels = ('Label 1', 'Label 2'), 
        set_colors=("#098154","#c72e29"),
        alpha=0.6,
        normalize_to=1.0,
       )
g.get_patch_by_id('10').set_edgecolor('red')#左圈外框颜色
g.get_patch_by_id('10').set_linestyle('--')#左圈外框线型
g.get_patch_by_id('10').set_linewidth(2)#左圈外框线宽
g.get_patch_by_id('01').set_edgecolor('green')#右圈外框颜色
g.get_patch_by_id('11').set_edgecolor('blue')#中间圈外框颜色
plt.show()

Python matplotlib可视化之绘制韦恩图

单个圈文本设置

g.get_label_by_id('10') 返回一个matplotlib.text.Text对象,有诸多参数可个性化修改 ,详细见matplotlib官网。

my_dpi=150
plt.figure(figsize=(600/my_dpi, 600/my_dpi), dpi=my_dpi)
g=venn2(subsets = [{1,2,3},{1,2,4}], 
        set_labels = ('Label 1', 'Label 2'), 
        set_colors=("#098154","#c72e29"),
        alpha=0.6,
        normalize_to=1.0,
       )
g.get_label_by_id('10').set_fontfamily('Microsoft YaHei')#左圈中1的字体设置为微软雅黑
g.get_label_by_id('10').set_fontsize(20)#1的大小设置为20
g.get_label_by_id('10').set_color('r')#1的颜色
g.get_label_by_id('10').set_rotation(45)#1的倾斜度

添加额外注释 

my_dpi=150
plt.figure(figsize=(580/my_dpi, 580/my_dpi), dpi=my_dpi)#控制图尺寸的同时,使图高分辨率(高清)显示
g=venn2(subsets = [{1,2,3},{1,2,4}], #绘图数据集
        set_labels = ('Label 1', 'Label 2'), #设置组名
        set_colors=("#098154","#c72e29"),#设置圈的颜色,中间颜色不能修改
        alpha=0.6,#透明度
        normalize_to=1.0,#venn图占据figure的比例,1.0为占满
       )
 
plt.annotate('I like this green part!', 
             color='#098154',
             xy=g.get_label_by_id('10').get_position() - np.array([0, 0.05]), 
             xytext=(-80,40),
             ha='center', textcoords='offset points', 
             bbox=dict(boxstyle='round,pad=0.5', fc='#098154', alpha=0.6),#注释文字底纹
             arrowprops=dict(arrowstyle='-|>', connectionstyle='arc3,rad=0.5',color='#098154')#箭头属性设置
            )
 
 
plt.annotate('She like this red part!', 
             color='#c72e29',
             xy=g.get_label_by_id('01').get_position() + np.array([0, 0.05]), 
             xytext=(80,40),
             ha='center', textcoords='offset points', 
             bbox=dict(boxstyle='round,pad=0.5', fc='#c72e29', alpha=0.6),
             arrowprops=dict(arrowstyle='-|>', connectionstyle='arc3,rad=0.5',color='#c72e29')
            )
 
plt.annotate('We both dislike this strange part!', 
             color='black',
             xy=g.get_label_by_id('11').get_position() + np.array([0, 0.05]), 
             xytext=(20,80),
             ha='center', textcoords='offset points', 
             bbox=dict(boxstyle='round,pad=0.5', fc='grey', alpha=0.6),
             arrowprops=dict(arrowstyle='-|>', connectionstyle='arc3,rad=-0.5',color='black')
            )
 
plt.show()

Python matplotlib可视化之绘制韦恩图

多子图绘制venn图 

fig,axs=plt.subplots(1,3, figsize=(10,8),dpi=150)
g=venn2(subsets = [{1,2,3},{1,2,4}], 
        set_labels = ('Label 1', 'Label 2'), 
        set_colors=("#098154","#c72e29"),
        alpha=0.6,
        normalize_to=1.0,
        ax=axs[0],#该参数指定
       )
g=venn2(subsets = [{1,2,3,4,5,6},{1,2,4,5,6,7,8}], 
        set_labels = ('Label 3', 'Label 4'), 
        set_colors=("#098154","#c72e29"),
        alpha=0.6,
        normalize_to=1.0,
        ax=axs[1],
       )
g=venn2(subsets = [{0,1,2,3},{1,2,4}], 
        set_labels = ('Label 5', 'Label 6'), 
        set_colors=("#098154","#c72e29"),
        alpha=0.6,
        normalize_to=1.0,
        ax=axs[2],
       )
plt.show()

Python matplotlib可视化之绘制韦恩图

(2)3组数据venn图

matplotlib_venn.venn3(subsets, set_labels=('A', 'B', 'C'), set_colors=('r', 'g', 'b'), alpha=0.4, normalize_to=1.0, ax=None, subset_label_formatter=None)

参数和venn2几乎一样,介绍几个重要参数 

基本参数介绍

my_dpi=150
plt.figure(figsize=(600/my_dpi, 600/my_dpi), dpi=my_dpi)#控制图尺寸的同时,使图高分辨率(高清)显示
g=venn3(subsets = [{1,2,3},{1,2,4},{2,6,7}], #传入三组数据
        set_labels = ('Label 1', 'Label 2','Label 3'), #设置组名
        set_colors=("#01a2d9", "#31A354", "#c72e29"),#设置圈的颜色,中间颜色不能修改
        alpha=0.8,#透明度
        normalize_to=1.0,#venn图占据figure的比例,1.0为占满
       )
plt.show()

Python matplotlib可视化之绘制韦恩图

个性化设置图中7部分每一部分

(100, 010, 110, 001, 101, 011, 111)分别代替每一小块,那么代替的是那一小块了? 

my_dpi=150
plt.figure(figsize=(600/my_dpi, 600/my_dpi), dpi=my_dpi)
g=venn3(subsets = [{1,2,3},{1,2,4},{2,6,7}],
        set_labels = ('Label 1', 'Label 2','Label 3'),
        set_colors=("#01a2d9", "#31A354", "#c72e29"),
        alpha=0.8,
        normalize_to=1.0,
       )
 
for i in list('100, 010, 110, 001, 101, 011, 111'.split(', ')):
    g.get_label_by_id('%s'%i).set_text('%s'%i)#修改每个组分的文本
    
#然后就可以如同venn2中那样个性化设置了
g.get_label_by_id('110').set_color('red')#1的颜色
g.get_patch_by_id('110').set_edgecolor('red')
 
plt.show()

Python matplotlib可视化之绘制韦恩图

2、pyvenn

同样,该库还是基于matplotlib.patches二次开发;

区别于上文,pyvenn支持2到6组数据;matplotlib_venn更加灵活多变。

pyvenn具有'venn2', 'venn3', 'venn4', 'venn5', 'venn6'五大主要函数,这里主要介绍venn2,其它同理。

2组数据venn

venn.draw_annotate、venn.draw_text、venn.venn2中的fill()参数非常助于个性化设置。

venn2(labels, names=['A', 'B'], **options)   
import matplotlib.pyplot as plt
 
#添加pyvenn路径
import sys
sys.path.append(r'path\pyvenn-master')
import venn
 
mycolor=[[0.10588235294117647, 0.6196078431372549, 0.4666666666666667,0.6],
         [0.9058823529411765, 0.1607843137254902, 0.5411764705882353, 0.6]]
 
labels = venn.get_labels([[1,2,3,4,5,6],[1,2,4,5,6,7,8]], fill=['number', 
                                                                'logic',#开启每个组分代码
                                                                'percent'#每个组分的百分比
                                                               ],
                        )
fig, ax = venn.venn2(labels,
                    names=list('AB'),
                    dpi=96,
                    colors=mycolor,#传入RPGA色号,直接传hex色号或者RGB会导致重叠部分被覆盖
                    fontsize=15,#控制组名及中间数字大小
                   
                    
                    )
plt.style.use('seaborn-whitegrid')
ax.set_axis_on()#开启坐标网格线
#ax.set_title('venn2')
 
 
 
# 提取plt.annotate部分参数
venn.draw_annotate(fig, ax, x=0.3, y=0.18, #箭头的位置
                   textx=0.1, texty=0.05, #箭尾的位置
                   text='Aoligei!', color='r', #注释文本属性
                   arrowcolor='r',#箭头的颜色等属性
                  )
 
#添加文本
venn.draw_text(fig, ax, x=0.25, y=0.2, text='number:logic(percent)',
               fontsize=12, ha='center', va='center')

Python matplotlib可视化之绘制韦恩图

3组数据venn

labels = venn.get_labels([range(10), range(5, 15), range(3, 8)], fill=['number',
                                                                       'logic',
                                                                       'percent'
                                                                      ]
                        )
fig, ax = venn.venn3(labels, names=list('ABC'),dpi=96)
fig.show()

Python matplotlib可视化之绘制韦恩图

4组数据venn

labels = venn.get_labels([range(10), range(5, 15), range(3, 8), range(8, 17)], fill=['number', 
                                                                                     'logic',
                                                                                     'percent'                                                                                     
                                                                                    ])
fig, ax = venn.venn4(labels, names=list('ABCD'))
fig.show()

Python matplotlib可视化之绘制韦恩图

5组数据venn

labels = venn.get_labels([range(10), range(5, 15), range(3, 8), range(8, 17), range(10, 20)], fill=['number',
                                                                                                    'logic',
                                                                                                    'percent'
                                                                                                   ])
fig, ax = venn.venn5(labels, names=list('ABCDEF'))
fig.show()

Python matplotlib可视化之绘制韦恩图

6组数据venn

labels = venn.get_labels([range(10), range(5, 15), range(3, 8), range(8, 17), range(10, 20), range(13, 25)], fill=['number', 'logic','percent'])
fig, ax = venn.venn6(labels, names=list('ABCDEF'))
fig.show()

Python matplotlib可视化之绘制韦恩图

以上就是Python matplotlib可视化之绘制韦恩图的详细内容,更多关于Python matplotlib韦恩图的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
使用python实现拉钩网上的FizzBuzzWhizz问题示例
May 05 Python
Python的装饰器用法学习笔记
Jun 24 Python
python虚拟环境virualenv的安装与使用
Dec 18 Python
浅谈Python基础之I/O模型
May 11 Python
python之pandas用法大全
Mar 13 Python
用python简单实现mysql数据同步到ElasticSearch的教程
May 30 Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 Python
Python基础之循环语句用法示例【for、while循环】
Mar 23 Python
Django 查询数据库并返回页面的例子
Aug 12 Python
python监控nginx端口和进程状态
Sep 06 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
Jul 20 Python
Python爬取12306车次信息代码详解
Aug 12 Python
Python语言中的数据类型-序列
Feb 24 #Python
浅析python中特殊文件和特殊函数
Feb 24 #Python
Python中字符串对象语法分享
Feb 24 #Python
Python+Matplotlib+LaTeX玩转数学公式
Python语言内置数据类型
Feb 24 #Python
Python中的程序流程控制语句
Feb 24 #Python
python中对列表的删除和添加方法详解
Feb 24 #Python
You might like
简单采集了yahoo的一些数据
2007/02/14 PHP
深入解析php之sphinx
2013/05/15 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
2017/08/01 PHP
PHP手机号码及邮箱正则表达式实例解析
2020/07/11 PHP
js中document.write使用过程中的一点疑问解答
2014/03/20 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
jQuery实现的tab标签切换效果示例
2016/09/05 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
详解Vue方法与事件
2017/03/09 Javascript
vue-ajax小封装实例
2017/09/18 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
vee-validate vue 2.0自定义表单验证的实例
2018/08/28 Javascript
Vue 实例事件简单示例
2019/09/19 Javascript
JavaScript实现答题评分功能页面
2020/06/24 Javascript
浅谈vue-props的default写不写有什么区别
2020/08/09 Javascript
JQuery基于FormData异步提交数据文件
2020/09/01 jQuery
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
[01:04:32]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第二场 2月23日
2021/03/11 DOTA
python学习基础之循环import及import过程
2018/04/22 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
Python实现名片管理系统
2020/02/14 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
Otticanet英国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/02/10 全球购物
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
毕业生优秀推荐信
2013/11/26 职场文书
生产内勤岗位职责
2013/12/07 职场文书
《火烧云》教学反思
2014/04/12 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
云南省召开党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
西安大雁塔导游词
2015/02/10 职场文书
永远是春天观后感
2015/06/12 职场文书