前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >局部整体(二)利用python绘制维恩图

局部整体(二)利用python绘制维恩图

作者头像
HsuHeinrich
发布于 2024-11-23 00:32:42
发布于 2024-11-23 00:32:42
7400
代码可运行
举报
文章被收录于专栏:HsuHeinrichHsuHeinrich
运行总次数:0
代码可运行

局部整体(二)利用python绘制维恩图

维恩图( Venn Diagram)简介

维恩图显示集与集之间所有可能存在的逻辑关系,每个集通常以一个圆圈表示,每个集都是一组具有共同之处的物件或数据。当多个圆圈(集)相互重迭时,称为交集 (intersection),里面的数据同时具有重迭集中的所有属性。可以直观的寻找集合的共同点和差异点,缺点是集合过多(超过4个)就会显得杂乱不美观。

快速绘制

基于matplotlib_venn

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib.pyplot as plt
from matplotlib_venn import venn2

# 利用venn2快速创建2venn2(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的交集区域的大小

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib.pyplot as plt
from matplotlib_venn import venn3

# 利用venn3快速创建3venn3(subsets = (10, 8, 22, 6,9,4,2))

plt.show()

输入集合直接绘制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()

修改参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()

自定义细节

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()

绘制文本类维恩图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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图展示更多集合关系

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HsuHeinrich 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 局部整体(二)利用python绘制维恩图
    • 维恩图( Venn Diagram)简介
    • 快速绘制
    • 定制多样化的维恩图
    • 总结
      • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档