如何在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))
接下来就是精准颜色混合的核心操作:
自定义颜色混合的步骤
- 选好基础色:给三个主集合挑你喜欢的颜色,用RGB格式(值在0-1之间)来定义,这样方便后续计算混合色。
- 计算混合色:重叠区域的颜色可以用对应基础色的平均值,或者你也可以根据需求调整加权比例。
- 给每个区域上色:通过
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
相关产品推荐
相关产品推荐

