维恩图显示集与集之间所有可能存在的逻辑关系,每个集通常以一个圆圈表示,每个集都是一组具有共同之处的物件或数据。当多个圆圈(集)相互重迭时,称为交集 (intersection),里面的数据同时具有重迭集中的所有属性。可以直观的寻找集合的共同点和差异点,缺点是集合过多(超过4个)就会显得杂乱不美观。
基于matplotlib_venn
import matplotlib.pyplot as plt
from matplotlib_venn import venn2
# 利用venn2快速创建2组
venn2(subsets = (10, 5, 2), set_labels = ('Group A', 'Group B'))
plt.show()
自定义维恩图一般是结合使用场景对相关参数进行修改,并辅以其他的绘图知识。参数信息可以通过官网进行查看,其他的绘图知识则更多来源于实战经验,大家不妨将接下来的绘图作为一种学习经验,以便于日后总结。
关于matplotlib_venn的更多用法可参考matplotlib-venn[1]
利用venn3快速创建3组
各位置的含义 1:仅包含集合1的区域的大小 2:仅包含集合2的区域的大小 3:集合1和集合2的交集区域的大小 4:仅包含集合3的区域的大小 5:集合1和集合3的交集区域的大小 6:集合2和集合3的交集区域的大小 7:集合1,集合2和集合3的交集区域的大小
import matplotlib.pyplot as plt
from matplotlib_venn import venn3
# 利用venn3快速创建3组
venn3(subsets = (10, 8, 22, 6,9,4,2))
plt.show()
输入集合直接绘制
import matplotlib.pyplot as plt
from matplotlib_venn import venn3
set1 = set([1, 2, 3, 4, 5])
set2 = set([4, 5, 6, 7])
set3 = set([5, 6, 7, 8, 9])
# 利用venn3快速创建3组-输入集合
venn3(subsets = [set1, set2, set3], set_labels = ('set1', 'set2', 'set3'))
plt.show()
修改参数
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib_venn import venn3, venn3_circles
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
# 初始化布局
fig = plt.figure(figsize=(8,8))
# 自定义标签
plt.subplot(2, 2, 1)
v=venn3(subsets = (10, 8, 22, 6,9,4,2), set_labels = ('Group A', 'Group B', 'Group C'))
v.get_label_by_id('A').set_text('My Favourite group!')
plt.title('自定义标签')
# 自定义圆圈
plt.subplot(2, 2, 2)
v=venn3(subsets = (10, 8, 22, 6,9,4,2), set_labels = ('Group A', 'Group B', 'Group C'))
c=venn3_circles(subsets = (10, 8, 22, 6,9,4,2), linestyle='dashed', linewidth=1, color="grey")
plt.title('自定义圆圈')
# 自定义单组
plt.subplot(2, 2, 3)
v=venn3(subsets = (10, 8, 22, 6,9,4,2), set_labels = ('Group A', 'Group B', 'Group C'))
c=venn3_circles(subsets = (10, 8, 22, 6,9,4,2), linestyle='dashed', linewidth=1, color="grey")
c[0].set_lw(8.0)
c[0].set_ls('dotted')
c[0].set_color('skyblue')
plt.title('自定义单组')
# 自定义背景色
plt.subplot(2, 2, 4)
v=venn3(subsets = (10, 8, 22, 6,9,4,2), set_labels = ('Group A', 'Group B', 'Group C'))
plt.gca().set_facecolor('skyblue')
plt.gca().set_axis_on()
plt.title('自定义背景色')
plt.show()
自定义细节
from matplotlib import pyplot as plt
import numpy as np
from matplotlib_venn import venn3, venn3_circles
# 绘制维恩图
v = venn3(subsets=(1, 1, 1, 1, 1, 1, 1), set_labels = ('A', 'B', 'C'))
# 自定义风格
v.get_patch_by_id('100').set_alpha(1.0) # 获取集合'100'(代表只有第一个集合的部分),并设置透明度为1.0(完全不透明)
v.get_patch_by_id('100').set_color('white') # 同上修改颜色
v.get_label_by_id('100').set_text('Unknown') # 同上修改文本
v.get_label_by_id('A').set_text('Set "A"') # 集合A的标签修改为【Set "A"】
c = venn3_circles(subsets=(1, 1, 1, 1, 1, 1, 1), linestyle='dashed')
c[0].set_lw(1.0) # 修改第一个圆图的线宽
c[0].set_ls('dotted') # 修改第一个圆图为点线
# 添加文本注释
plt.title("Sample Venn diagram")
plt.annotate('Unknown set', xy=v.get_label_by_id('100').get_position() - np.array([0, 0.05]), xytext=(-70,-70),
ha='center', textcoords='offset points', bbox=dict(boxstyle='round,pad=0.5', fc='gray', alpha=0.1),
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0.5',color='gray'))
plt.show()
绘制文本类维恩图
from matplotlib_venn import venn2, venn2_circles
import matplotlib.pyplot as plt
set1 = set(["苹果", "香蕉", "橘子"])
set2 = set(["香蕉", "橘子", "葡萄"])
venn = venn2([set1, set2], ('A', 'B'))
venn.get_label_by_id('10').set_text('\n'.join(set1-set2))
venn.get_label_by_id('01').set_text('\n'.join(set2-set1))
venn.get_label_by_id('11').set_text('\n'.join(set1&set2))
plt.show()
引申-利用upset图展示更多集合关系
from upsetplot import generate_counts, plot
import matplotlib.pyplot as plt
example = generate_counts()
plot(example)
plt.show()
下面图中元素较多,但不难理解 1、左下的条形图表示每个集合元素的数量 2、下方的点图表示出现的所有交集情况 3、上方的条形图对应交集内的元素数量 更多方法可参考UpSetPlot documentation[2]
以上通过matplotlib_venn快速绘制维恩图,并通过修改参数或者辅以其他绘图知识自定义各种各样的维恩图来适应相关使用场景。也介绍了如何使用upset
图展示更多集合关系。
共勉~
[1]
matplotlib-venn: https://pypi.org/project/matplotlib-venn/#description
[2]
UpSetPlot documentation: https://upsetplot.readthedocs.io/en/stable/
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有