
代码绘制成果展示














代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.colors import LinearSegmentedColormapimport matplotlib.patches as patches

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: {'white', 'seg_acc': '#D3A4A4', 'seg_div': '#8FAADC',['#003366', '#7F99B2', 'white', '#C57F7F', '#8B0000'],['#FF7F50', '#FFBFA7', 'white', '#96879E', '#2D103D']},}

第三部分

# =========================================================================================# ======================================4.绘图函数=======================================# =========================================================================================def plot_advanced_forest_chart(df, scheme_id):colors = COLOR_SCHEMES[scheme_id] # 提取配色方案sections = [] # 初始化图块数据列表#获取热图结构的列名标签fixed_columns = ['Section', 'Gene', 'Qval', 'Is_Bold', 'Is_Red']struct_labels = [col for col in df.columns if col not in fixed_columns]num_structs = len(struct_labels) #判定热图层数total_genes = sum(sec["count"] for sec in sections) # 计算所有部分y总数cmap_expr = LinearSegmentedColormap.from_list("expr_cmap", colors['expr_cmap']) # 热图颜色映射cmap_qval = LinearSegmentedColormap.from_list("qval_cmap", colors['qval_cmap']) # q值颜色映射

第四部分

# 创建画布fig = plt.figure(figsize=(12, 12), facecolor='white')# 主轴ax = fig.add_axes([0.1, # x0.1, # y0.8, # 宽度比例0.8], # 高度比例polar=True) # 极坐标current_angle = np.pi / 2 # 初始角度all_angles = [] # 保存每个x角度

第五部分

# 遍历不同部分for sec_idx, sec in enumerate(sections):count = sec["count"] # 获取此部分x数sector_angle_span = available_angle * (count / total_genes) # 弧度# 生成各点角度angles = np.linspace(current_angle, # 起始角度current_angle + sector_angle_span, # 结束角度count) # 数量all_angles.extend(angles) # 保存theta_mid = current_angle + sector_angle_span / 2 # 此部分热图中间角度theta_mid_deg = np.degrees(theta_mid) # 转为角度if sec_idx < len(sections) - 1:current_angle += sector_angle_span + gap_small # 累加图块角度及小间隙else:current_angle += sector_angle_span + gap_large # 累加图块角度及大间隙

第六部分

# 添加正北方文本for row in range(num_structs):ax.text(np.pi / 2 - 0.06, # 角度color='black') # 颜色# 显著性文本ax.text(np.pi / 2 - 0.06, r_qval, # 角度半径color='black') # 颜色

第七部分

# 韦恩图轴位置ax_center = fig.add_axes([0.35, 0.35, 0.3, 0.3])ax_center.axis('off') # 去掉图框等ax_center.set_xlim(0, 10) # x轴范围ax_center.set_ylim(0, 10) # y轴范围ax_center.set_aspect('equal') # 等比例# 绘制ax_center.add_patch(c1_fill)ax_center.add_patch(c2_fill)ax_center.add_patch(c3_fill)# 添加到图上ax_center.add_patch(c1_edge)ax_center.add_patch(c2_edge)ax_center.add_patch(c3_edge)ax_center.text(5, # x2.0, # y"Morphogenic\ngenes", # 文本ha='center', # 水平va='center', # 垂直fontsize=16, # 大小fontweight='bold') # 加粗

第八部分

# 热图颜色条cbar_ax_expr = fig.add_axes([0.95, # x0.65, # y0.016, # 宽0.18]) # 高#获取实际数据的以映射颜色条的极限值expr_min = df[struct_labels].min().min()#极小expr_max = df[struct_labels].max().max()#极大norm_expr = plt.Normalize(vmin=expr_min, vmax=expr_max)#范围cbar_expr = fig.colorbar(plt.cm.ScalarMappable(norm=norm_expr, cmap=cmap_expr), cax=cbar_ax_expr) # 生成颜色条cbar_qval.ax.yaxis.set_major_locator(ticker.MaxNLocator(5))#刻度线cbar_qval.ax.tick_params(length=0, width=0, labelsize=12)

第九部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================if __name__ == "__main__":df_real = pd.read_excel(r'data.xlsx') #读取数据scheme_id = 1print('正在绘制并保存方案:', scheme_id)selected_hex_colors = COLOR_SCHEMES[scheme_id]plot_advanced_forest_chart(df_real, scheme_id)

如何应用到你自己的数据

1.设置原始数据的保存路径,执行部分:
df_real = pd.read_excel(r'\data.xlsx') #读取数据2.设置是否批量绘图,执行部分:
plot_all = True # 是否批量绘图3.定义要读取和标注在正北方的y名称,绘图函数部分:
fixed_columns = ['Section', 'Gene', 'Qval', 'Is_Bold', 'Is_Red']4.定义部分名称,绘图函数部分:
sec_names = df['Section'].unique().tolist()5.定义要用到的其他数据名,绘图函数部分:
sections.append({"name": sec_name, # 部分名称"count": len(df_sec), # 对应数据行数"color": sec_col, # 颜色"edge": "black", # 边缘颜色"genes": df_sec['Gene'].tolist(), #提取并保存x列表"qvals": df_sec['Qval'].values, #提取并保存q值数组"expr_data": [df_sec[struct_labels[i]].values for i in range(num_structs)], #提取并保存y数据矩阵"is_bold": df_sec['Is_Bold'].tolist(), # 是否加粗标志"is_red": df_sec['Is_Red'].tolist() # 是否标红标志})
6.定义韦恩图的大小位置,我手动绘制的因为画出来效果比较好看这块需要改的多,绘图函数部分:
r1, r2, r3 = 1.6, 1.4, 2.0 # 圆半径cx1, cx2, cx3 = 2.8, 5.0, 7.5 # 圆心x坐标
7.定义韦恩图的文本部分,绘图函数部分:
ax_center.text(4.0, 5, '1', ha='center', va='center', fontsize=11)8.设置绘图结果的保存地址,绘图函数部分:
plt.savefig(fr"scheme_{scheme_id}.png", dpi=300, bbox_inches='tight')
推荐


获取方式
