在ununtu上使用该命令安装draw_rna pip install matplotlib numpy draw_rna --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple -------------------------------打开原本步骤中lab中的记事本-------------------------- # 依赖导入 from nupack import * from draw_rna.ipynb_draw import draw_struct import os import matplotlib.pyplot as plt # 开启显示(恢复正常绘图展示) plt.ion() # ====================================== # 仅保留两个核心函数,完全用 draw_rna # ====================================== def get_mfe_structure(complex_name: str, nupack_result, strands: list): """获取复合物MFE结构,支持同源二聚体 Y1+Y1""" strand_names = complex_name.strip('()').split('+') strand_map = {s.name: s for s in strands} strand_objs = [strand_map[name] for name in strand_names] complex_obj = Complex(strand_objs) return str(nupack_result[complex_obj].mfe[0].structure) def draw_complex(complex_name: str, nupack_result, strands: list, output_folder="./"): """draw_rna绘图:无页面显示,直接保存图片到目标路径""" os.makedirs(output_folder, exist_ok=True) # 获取结构和序列(完全不变) struct = get_mfe_structure(complex_name, nupack_result, strands) strand_names = complex_name.strip('()').split('+') strand_map = {s.name: s for s in strands} seq = " ".join([str(strand_map[name]) for name in strand_names]) # 序列用空格分隔 draw_structure = struct.replace('+', ' ') # 结构用空格分隔 # 设置全局字体大小,可以根据需要调整数字 (例如 14, 18, 20) plt.rcParams['font.size'] = 12 # ---------- 修正点:显式创建画布并传递给 draw_struct ---------- fig, ax = plt.subplots(figsize=(15, 15)) # 可调尺寸,保证图形清晰 draw_struct(seq, draw_structure, ax=ax) # 在指定 ax 上绘图 # 保存并关闭 save_name = complex_name.strip('()').replace('+', '_') + '.png' save_path = os.path.join(output_folder, save_name) plt.savefig(save_path, dpi=300, bbox_inches='tight') print(f"\n✅ 图片已保存至:{save_path}") print(f"MFE 结构:{struct}") def draw_all_complexes(nupack_result, strands: list, output_folder="./"): print("\n========== 开始批量绘制所有复合物 ==========") # 过滤出 Complex 对象 complex_objs = [obj for obj in nupack_result.keys() if not isinstance(obj, Tube)] total = len(complex_objs) success_count = 0 for idx, complex_obj in enumerate(complex_objs, 1): complex_name = complex_obj.name # ✅ 修正点 try: draw_complex(complex_name, nupack_result, strands, output_folder) success_count += 1 print(f"进度:{idx}/{total} 完成") except Exception as e: print(f"❌ 绘制复合物 {complex_name} 失败: {e}") print("\n========== 所有复合物绘制完成 ==========") print(f"✅ 批量绘制完成!成功:{success_count} / 总计:{total}") print(f"📁 图片保存在:{os.path.abspath(output_folder)}") -------------------------------- nupack计算-------------------------------------- model1 = Model(material='dna', celsius=37,sodium=0.1, magnesium=0.02) Y1 = Strand('CGTTAACGCAGTGAGGACGGTAGTTTGTCGTTCCATCGCACC', name='Y1') Y2 = Strand('CGTTAACGGGTGCGATGGAACGACTTTCGACAGGCCTGGTGTAATTTCACCCATGTTAGTCGA', name='Y2') Y3 = Strand('ATACGGAAAATGGAGATAGGAAGAGTACAATGTCAGCGATAAATTCCGTATACGACACCAGGCCTGTCGATTACTACCGTCCTCACTG', name='Y3') t1 = Tube({Y1: 1e-8, Y2: 1e-8, Y3:1e-8 },complexes=SetSpec(max_size=4), name='Tube 1') my_result = tube_analysis(tubes=[t1], model=model1, compute=['pfunc', 'pairs', 'mfe', 'sample', 'subopt'], options={'num_sample': 1, 'energy_gap': 0.5}) print(my_result) --------------------------- --------------- 单复合物绘图------------------------------ target = '(Y1+Y1+Y2+Y3)' # 替换为你的目标复合物名称 all_strands = [Y1, Y2, Y3] # 所有链的列表 # 1. 获取并打印MFE结构 mfe_struct = get_mfe_structure(target, my_result, all_strands) #print("MFE结构:", mfe_struct) # 2. 绘制二级结构 draw_complex(target, my_result, all_strands, output_folder="/home/zsy") --------------------------------------------批量绘图----------------------------------- strands_list = [Y1, Y2, Y3] draw_all_complexes(my_result, strands_list, output_folder="/home/zsy/jihe")