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

如何在Python的matplotlib_venn中实现精准的颜色混合?

如何在Python的matplotlib_venn中实现精准的颜色混合?

嘿,我看到你已经在用matplotlib_venn绘制下调基因的三元韦恩图了,想要精准控制重叠区域的颜色混合效果对吧?默认情况下,venn3会自动生成重叠色,但往往不是咱们想要的那种精准混合感。别担心,咱们手动自定义每个区域的颜色就能搞定!

先把你的代码补全完整(你之前的代码有点截断了),方便后续改颜色:

import matplotlib.pyplot as plt
from matplotlib_venn import venn3

# Convert the 'Gene_Name' columns to sets for comparison
genes_5min_Down = set(Host_5min_Down_gene['Gene_Name'])
genes_10min_Down = set(Host_10min_Down_gene['Gene_Name'])
genes_no_phage_Down = set(No_phage_Down_gene['Gene_Name'])

# Create a Venn diagram
venn = venn3([genes_5min_Down, genes_10min_Down, genes_no_phage_Down], 
             set_labels=('Host 5min infection', 'Host 10min infection', 'No Phage infection'))

# Customize the labels to show counts
# Get the sizes for each section
only_5min_Down = len(genes_5min_Down - genes_10min_Down - genes_no_phage_Down)
only_10min_Down = len(genes_10min_Down - genes_5min_Down - genes_no_phage_Down)
only_no_phage_Down = len(genes_no_phage_Down - genes_5min_Down - genes_10min_Down)
common_5min_10min_Down = len(genes_5min_Down & genes_10min_Down - genes_no_phage_Down)
common_5min_no_phage_Down = len(genes_5min_Down & genes_no_phage_Down - genes_10min_Down)
common_10min_no_phage_Down = len(genes_10min_Down & genes_no_phage_Down - genes_5min_Down)
common_all_three_Down = len(genes_5min_Down & genes_10min_Down & genes_no_phage_Down)

# Update the text labels with the calculated counts
venn.get_label_by_id('100').set_text(str(only_5min_Down))
venn.get_label_by_id('010').set_text(str(only_10min_Down))
venn.get_label_by_id('001').set_text(str(only_no_phage_Down))
venn.get_label_by_id('110').set_text(str(common_5min_10min_Down))
venn.get_label_by_id('101').set_text(str(common_5min_no_phage_Down))
venn.get_label_by_id('011').set_text(str(common_10min_no_phage_Down))
venn.get_label_by_id('111').set_text(str(common_all_three_Down))

接下来就是精准颜色混合的核心操作:

自定义颜色混合的步骤

  1. 选好基础色:给三个主集合挑你喜欢的颜色,用RGB格式(值在0-1之间)来定义,这样方便后续计算混合色。
  2. 计算混合色:重叠区域的颜色可以用对应基础色的平均值,或者你也可以根据需求调整加权比例。
  3. 给每个区域上色:通过get_patch_by_id()获取每个区域的图形块,然后设置颜色和透明度。

直接把这段代码加在上面的脚本后面(在plt.show()之前):

# 定义三个主集合的基础RGB颜色
color_5min = (1.0, 0.41, 0.41)    # 珊瑚红
color_10min = (0.31, 0.81, 0.77)  # 薄荷绿
color_nophage = (1.0, 0.90, 0.43) # 柠黄

# 计算各重叠区域的混合色(这里用简单的平均值,你可以改成加权混合)
color_5min_10min = tuple((c1 + c2)/2 for c1, c2 in zip(color_5min, color_10min))
color_5min_nophage = tuple((c1 + c2)/2 for c1, c2 in zip(color_5min, color_nophage))
color_10min_nophage = tuple((c1 + c2)/2 for c1, c2 in zip(color_10min, color_nophage))
color_all_three = tuple((c1 + c2 + c3)/3 for c1, c2, c3 in zip(color_5min, color_10min, color_nophage))

# 给每个区域设置颜色
venn.get_patch_by_id('100').set_color(color_5min)
venn.get_patch_by_id('010').set_color(color_10min)
venn.get_patch_by_id('001').set_color(color_nophage)
venn.get_patch_by_id('110').set_color(color_5min_10min)
venn.get_patch_by_id('101').set_color(color_5min_nophage)
venn.get_patch_by_id('011').set_color(color_10min_nophage)
venn.get_patch_by_id('111').set_color(color_all_three)

# 可选:调整透明度,让重叠效果更自然(值在0-1之间,越小越透明)
for patch in venn.patches:
    if patch is not None:
        patch.set_alpha(0.7)

plt.title("Downregulated Genes Venn Diagram")
plt.show()

额外小技巧

  • 如果你想要更高级的混合效果,比如根据重叠基因的数量加权颜色,可以用区域的大小作为权重来计算RGB值,比如:
    # 举个例子,5min和10min重叠区域的加权混合
    weight_5min = only_5min_Down / (only_5min_Down + only_10min_Down)
    weight_10min = only_10min_Down / (only_5min_Down + only_10min_Down)
    color_5min_10min = tuple(c1*weight_5min + c2*weight_10min for c1, c2 in zip(color_5min, color_10min))
    
  • 十六进制颜色转RGB很简单,比如#FF6B6B,把每两位十六进制转成0-255的十进制,再除以255就得到0-1的RGB值了。

备注:内容来源于stack exchange,提问作者Melissa Arroyo-Mendoza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 12:03:05