如何用Python绘制指定集合操作对应的维恩图?求实现指导
Python绘制集合操作维恩图指南
首先安装matplotlib_venn库——这是Python中专门用于绘制维恩图的工具,依赖matplotlib:
pip install matplotlib-venn
以下针对你提供的集合与操作,逐一实现可视化:
初始集合的维恩图
给定初始集合:
a = {100, 3.12, False, "Bye"} b = {100, 3.12, False, "Welcome"}
绘制初始集合维恩图的代码:
from matplotlib_venn import venn2 import matplotlib.pyplot as plt set_a = a set_b = b # 绘制双集合维恩图框架 venn2([set_a, set_b], set_labels=('Set A', 'Set B')) # 添加虚线边框 venn2_circles([set_a, set_b], linestyle='dashed', linewidth=1, color='gray') # 标注各区域元素 plt.annotate('\n'.join(map(str, set_a - set_b)), xy=venn2.get_label_by_id('10').get_position(), ha='center') plt.annotate('\n'.join(map(str, set_b - set_a)), xy=venn2.get_label_by_id('01').get_position(), ha='center') plt.annotate('\n'.join(map(str, set_a & set_b)), xy=venn2.get_label_by_id('11').get_position(), ha='center') plt.title("初始集合维恩图") plt.show()
各类集合操作的维恩图实现
1. 差集(a.difference(b))
差集表示仅属于A但不属于B的元素,可视化代码:
diff_ab = a.difference(b) venn2([set_a, set_b], set_labels=('Set A', 'Set B')) venn2_circles([set_a, set_b], linestyle='dashed', linewidth=1, color='gray') # 高亮差集区域 venn2([diff_ab, set()], set_labels=('A - B', ''), alpha=0.5, colors=('blue', 'white')) plt.annotate('\n'.join(map(str, diff_ab)), xy=venn2.get_label_by_id('10').get_position(), ha='center') plt.title("A与B的差集") plt.show()
2. 交集(a.intersection(b))
交集表示同时属于A和B的元素,可视化代码:
intersect_ab = a.intersection(b) venn2([set_a, set_b], set_labels=('Set A', 'Set B')) venn2_circles([set_a, set_b], linestyle='dashed', linewidth=1, color='gray') # 高亮交集区域 venn2([intersect_ab, intersect_ab], set_labels=('A ∩ B', ''), alpha=0.5, colors=('purple', 'white')) plt.annotate('\n'.join(map(str, intersect_ab)), xy=venn2.get_label_by_id('11').get_position(), ha='center') plt.title("A与B的交集") plt.show()
3. 并集(a.union(b))
并集表示属于A或属于B的所有元素,可视化代码:
union_ab = a.union(b) venn2([set_a, set_b], set_labels=('Set A', 'Set B')) venn2_circles([set_a, set_b], linestyle='dashed', linewidth=1, color='gray') # 高亮并集区域 venn2([union_ab, union_ab], set_labels=('A ∪ B', ''), alpha=0.3, colors=('green', 'white')) plt.annotate('\n'.join(map(str, union_ab)), xy=(0, -0.5), ha='center') plt.title("A与B的并集") plt.show()
4. 修改集合后的维恩图
执行a.add(4)和a.remove("Bye")后,集合a变为{100, 3.12, False, 4},此时绘制与b的维恩图:
a_modified = {100, 3.12, False, 4} b = {100, 3.12, False, "Welcome"} venn2([a_modified, b], set_labels=('Modified A', 'Set B')) venn2_circles([a_modified, b], linestyle='dashed', linewidth=1, color='gray') plt.annotate('\n'.join(map(str, a_modified - b)), xy=venn2.get_label_by_id('10').get_position(), ha='center') plt.annotate('\n'.join(map(str, b - a_modified)), xy=venn2.get_label_by_id('01').get_position(), ha='center') plt.annotate('\n'.join(map(str, a_modified & b)), xy=venn2.get_label_by_id('11').get_position(), ha='center') plt.title("修改后A与B的维恩图") plt.show()
子集/超集的可视化判断
若a.issubset(b)返回True,维恩图会呈现A完全被B包含的形态;若a.issuperset(b)返回True,则B完全被A包含。你的初始集合中两者均为False,维恩图会显示两个集合有重叠但互不包含。
注:集合中不同类型的元素(数字、布尔值、字符串)可通过map(str, ...)统一转为字符串标注。
内容的提问来源于stack exchange,提问作者marivic valdehueza
相关产品推荐
相关产品推荐

