如何基于多个字典利用Seaborn绘制对比散点图
使用Seaborn绘制对比散点图分析CG重复次数
需求说明
基于两类序列数据(原始序列数据dict_1、ACGT含量一致的随机序列数据dict_2),对比猫和猎豹在不同碱基对长度(1000/2000/3000bp)下的CG重复次数:
- x轴设为碱基对长度(每1000bp为一个维度)
- y轴设为CG重复次数
- 同时区分原始/随机序列、不同动物的组别,实现直观对比
现有代码问题
当前代码直接将字典传入relplot,未匹配碱基对长度维度,也未区分序列类型,无法满足多维度对比需求。
解决方案
步骤1:整理数据为长格式DataFrame
Seaborn适配长格式数据,需将两个字典转换为包含以下字段的DataFrame:
bp_length:碱基对长度(1000/2000/3000)cg_count:CG重复次数organism:动物种类(cat/cheetah)seq_type:序列类型(原始序列/随机序列)
步骤2:绘制对比散点图
通过hue区分序列类型,style区分动物种类,让两类对比维度清晰呈现。
完整代码
import seaborn as sns import pandas as pd # 原始数据 dict_1 = {'cat': [53, 69, 0], 'cheetah': [65, 52, 28]} # 原始序列 dict_2 = {'cat': [40, 39, 10], 'cheetah': [35, 62, 88]} # 随机序列 bp_lengths = [1000, 2000, 3000] # 整理数据到列表 data = [] # 添加原始序列数据 for organism, counts in dict_1.items(): for bp, count in zip(bp_lengths, counts): data.append({ 'bp_length': bp, 'cg_count': count, 'organism': organism, 'seq_type': '原始序列' }) # 添加随机序列数据 for organism, counts in dict_2.items(): for bp, count in zip(bp_lengths, counts): data.append({ 'bp_length': bp, 'cg_count': count, 'organism': organism, 'seq_type': '随机序列' }) # 转换为DataFrame df = pd.DataFrame(data) # 设置绘图主题 sns.set_theme() # 绘制对比散点图 g = sns.relplot( data=df, x='bp_length', y='cg_count', hue='seq_type', # 颜色区分原始/随机序列 style='organism', # 标记样式区分动物种类 s=100, # 设置点的大小 markers=['o', 's'], # 自定义标记:圆形=猫,方形=猎豹 palette=['#1f77b4', '#ff7f0e'] # 自定义颜色:蓝色=原始,橙色=随机 ) # 设置图表标题和轴标签 g.set_axis_labels('碱基对长度 (bp)', 'CG重复次数') g.fig.suptitle('不同序列类型下的CG重复次数对比', y=1.02)
效果说明
- 不同颜色的点区分原始序列和随机序列
- 不同形状的点区分猫和猎豹
- 可直观观察同一动物在不同bp长度下,原始与随机序列的CG重复次数差异,也能对比不同动物间的差异
内容的提问来源于stack exchange,提问作者user19278046
相关产品推荐
相关产品推荐

