You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何获取matplotlib三元韦恩图各交集的元素列表

提取三元韦恩图各交集区域的元素列表

嘿,我明白你想从用matplotlib_venn绘制的三元韦恩图里,精准获取每个交集区域对应的元素列表对吧?其实不用依赖绘图对象的内部属性,直接利用Python的集合运算就能轻松搞定,而且结果和韦恩图的区域完全对应。下面结合你的示例代码一步步来:

第一步:明确韦恩图7个区域对应的集合运算

三元韦恩图总共有7个独立区域,每个区域对应的集合逻辑如下:

  • 仅属于A的元素:A - B - C(A减去B和C的所有元素)
  • 仅属于B的元素:B - A - C
  • 仅属于C的元素:C - A - B
  • A和B的交集(不含C):A & B - C
  • A和C的交集(不含B):A & C - B
  • B和C的交集(不含A):B & C - A
  • A、B、C三者的共同交集:A & B & C

第二步:结合你的示例代码实现提取

我先把你示例里的C补一个具体值方便演示,然后写出完整的提取代码:

from matplotlib import pyplot as plt
from matplotlib_venn import venn3, venn3_circles

# 你的原始集合
A = set(['DPEP1', 'CDC42BPA', 'GNG4', 'RAPGEFL1', 'MYH7B', 'SLC13A3', 'PHACTR3', 'SMPX', 'NELL2', 'PNMAL1', 'KRT23', 'PCP4', 'LOX', 'CDC42BPA'])
B = set(['ABLIM1','CDC42BPA','VSNL1','LOX','PCP4','SLC13A3'])
# 补全C的示例值
C = set(['CDC42BPA', 'LOX', 'PHACTR3', 'SMPX', 'NEW_GENE'])

# 提取各个区域的元素
only_A = A - B - C
only_B = B - A - C
only_C = C - A - B
A_B_no_C = A & B - C
A_C_no_B = A & C - B
B_C_no_A = B & C - A
A_B_C_all = A & B & C

# 打印结果
print("仅属于A的元素:", only_A)
print("仅属于B的元素:", only_B)
print("仅属于C的元素:", only_C)
print("A和B交集(不含C):", A_B_no_C)
print("A和C交集(不含B):", A_C_no_B)
print("B和C交集(不含A):", B_C_no_A)
print("三者共同交集:", A_B_C_all)

第三步:(可选)关联venn3的绘图区域ID

如果你想把提取的元素和venn3绘图时的区域ID对应起来(比如后续要给图加标注),venn3返回的对象支持用区域ID('100'对应仅A,'010'对应仅B,'001'对应仅C,'110'对应A∩B不含C,'101'对应A∩C不含B,'011'对应B∩C不含A,'111'对应三者交集)来关联元素:

# 绘制韦恩图
venn_plot = venn3([A, B, C], ('Set A', 'Set B', 'Set C'))
venn3_circles([A, B, C], linestyle='dashed', linewidth=1, color='gray')

# 用字典关联区域ID和元素列表
region_elements = {
    '100': only_A,
    '010': only_B,
    '001': only_C,
    '110': A_B_no_C,
    '101': A_C_no_B,
    '011': B_C_no_A,
    '111': A_B_C_all
}

# 示例:给每个区域添加元素列表标注(可选)
for region_id, elements in region_elements.items():
    if elements:
        label = venn_plot.get_label_by_id(region_id)
        if label:
            # 把元素转成换行的字符串
            elem_text = '\n'.join(elements)
            # 调整标注位置避免重叠
            label.set_text(elem_text)
            label.set_fontsize(8)

plt.title("Triple Venn Diagram with Element Labels")
plt.show()

这样你既能拿到每个区域的元素列表,还能把元素直接显示在韦恩图上,非常方便!

内容的提问来源于stack exchange,提问作者daniel_hck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:13:04