局部整体(二)利用python绘制维恩图
维恩图( Venn Diagram)简介
维恩图显示集与集之间所有可能存在的逻辑关系,每个集通常以一个圆圈表示,每个集都是一组具有共同之处的物件或数据。当多个圆圈(集)相互重迭时,称为交集 (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
-
利用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
总结
以上通过matplotlib_venn快速绘制维恩图,并通过修改参数或者辅以其他绘图知识自定义各种各样的维恩图来适应相关使用场景。也介绍了如何使用upset
图展示更多集合关系。
共勉~