当前位置:首页>python>Python绘制高颜值散点图矩阵+相关性分析网络图

Python绘制高颜值散点图矩阵+相关性分析网络图

  • 2026-09-10 21:43:45
Python绘制高颜值散点图矩阵+相关性分析网络图
请尊重原创成果,未经允许不得转载,谢谢

代码绘制成果展示

论文:Leaf stomatal configuration and photosynthetic traits jointly affect leaf water use efficiency in forests along climate gradients
原图
此图的左下角为主体散点图矩阵,对角线上的文本定义了基础变量,对角线下方各子图展示了两两变量之间的散点分布及线性回归拟合趋势;其中散点颜色对应4个生态站点,散点形状则代表不同类型特征;图右上半区构建了半环形拓扑网络,3个端点分别代表不同的目标变量;线条颜色反映皮尔逊相关系数的正负影响,线条粗细表示相关系数绝对值,线型表征统计显著性;右侧则垂直排列了4个清晰独立的图例块。此图适用于生态学、地球科学与自然地理学、植被遥感与定量遥感等众多领域的复杂多源数据分析展示。
仿图
多种配色

代码解释

第一部分

库的导入以及字体设置
# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import pandas as pdimport numpy as npimport seaborn as snsimport matplotlib.pyplot as plt

第二部分

设置颜色库
# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {    1: {        'sites': ['#008B8B', '#87CEFA', '#FFA07A', '#FF0000'], 'corr_positive': 'blue',    },}

第三部分

画布初始化与下三角散点图矩阵绘制:画布与网格划分,设置网格布局,用于跨子图绘制网络和曲线。绘制回归拟合趋势线和双重映射散点。设置边框与刻度,仅在最左侧和最下面显示。上三角区域设置为空白。对角线区域绘制对应变量名。
# =========================================================================================# ======================================4.绘图函数=======================================# =========================================================================================def create_network_scatterplot_matrix(df, color_scheme, save_path="."):    #网格布局    gs = fig.add_gridspec(total_rows,  # 行                          8,  # 列                          wspace=0.1,  # 宽间距                          hspace=0.1,  # 高间距                          left=0.05,  # 左边距                          bottom=0.05,  # 下边距                          right=0.95,  # 右边距                          top=0.95)  # 上边距            #去掉轴标签            ax.set_xlabel('')            ax.set_ylabel('')            # 是否是最后一行            if i == n_bottom - 1 and j < n_bottom - 1:                ax.xaxis.set_ticks_position('bottom');  # X刻度                ax.xaxis.set_label_position('bottom')  # X标签                #设置刻度样式                ax.tick_params(axis='x',  # 轴                               which='major',  # 主刻度                               labelsize=24,  # 字号                               length=TICK_LENGTH,  # 长度                               width=TICK_WIDTH)  # 宽度            else:                ax.set_xticks([])            # 是否是最左侧            if j == 0 and i > 0:                ax.yaxis.set_ticks_position('left');  # Y刻度                ax.yaxis.set_label_position('left')  # Y标签                # 设置刻度样式                ax.tick_params(axis='y',   # 轴                               labelsize=24,  # 字号                               length=TICK_LENGTH,  # 长度                               width=TICK_WIDTH)  # 宽度            else:                ax.set_yticks([])            # 上三角            if i < j:                ax.set_visible(False)  # 隐藏子

第四部分

坐标转换计算与网络节点绘制:基于散点对角线两端坐标加上偏移量,插值生成上方3个网络节点的线性排列坐标。在对角线端点及网络节点处绘制圆点。
    bottom_matrix_node_pos = {}  # 存放底部矩阵节点位置    network_node_pos = {}  # 存放网络节点位置    ellipse_height_data = 0.024  # 定义节点高    ellipse_width_data = ellipse_height_data * (8 / 16) * 1.5  # 定义节点宽    # 定义节点样式    node_style = {        'marker': 'o',  # 圆形        'markersize': 25,  # 大小        'color': color_scheme['node'],  # 颜色        'zorder': 10,  # 层        'markeredgecolor': 'black',  # 边框色        'linestyle': 'None',  # 无线        'clip_on': False  # 不裁剪    }        ax_main.text(label_pos[0],  # x                     label_pos[1],  # y                     f'${label}$',  # 文本                     ha='left',  # 水平                     va='center',  # 垂直                     fontsize=34,  # 字号                     fontweight='bold',  # 加粗                     zorder=101,  # 层                     color=color_scheme['legend_text'])  # 文本颜色

第五部分

统计相关性分析计算与网络连线绘制:循环遍历两两变量,剔除缺失值后计算r和P值。

设置相关性影响方向的颜色映射。根据显著性的数值设置线型映射。根据相关系数绝对值设置线的粗细,相关系数绝对值越大线越粗。

    arc_radius_base = -0.1  # 定义基础曲率半径    # 遍历网络变量起点    for var1 in network_vars:        features_to_connect = scatter_vars_bottom  # 连接散点目标变量                dynamic_arc_radius = arc_radius_base  # 原弧度            control_offset = np.linalg.norm(dist_vec) * dynamic_arc_radius  # 控制点偏移            control_point = midpoint + perp_vec * control_offset  # 控制点坐标            verts = [pos1, control_point, pos2]  # 控制点列表            codes = [Path.MOVETO, Path.CURVE3, Path.CURVE3]  # 贝塞尔路径指令            path = Path(verts, codes)  # 构造路径对象            # 创建曲线            patch = PathPatch(path,  # 路径对象                              facecolor='none',  # 背景色                              edgecolor=color,  # 轮廓颜色                              lw=linewidth,  # 线粗                              linestyle=linestyle,  # 线样式                              zorder=8,  # 层                              alpha=0.9,  # 透明度                              clip_on=False)  # 不裁剪            ax_main.add_patch(patch)  # 添加到图上

第六部分

图例的绘制以及绘图结果的保存
    ax_legend = fig.add_subplot(gs[:, 6])  # 添加图例轴    ax_legend.axis('off')  # 隐藏图例边框    current_y -= group_spacing  # 间距    #设置散点形状图例    ax_legend.text(0.35,  # x                   current_y,  # y                   'Leaf_type',  # 标题                   fontdict=title_font_props,  # 字体                   va='top')   # 垂直    current_y -= y_step * 1.2  # 更新    ax_legend.plot([x_icon - 0.05, x_icon + 0.05],  # x                   [current_y, current_y],  # y                   color=color_scheme['corr_negative'],  # 颜色                   lw=3,  # 粗细                   clip_on=False)  # 防裁剪    ax_legend.plot([x_icon - 0.05, x_icon + 0.15],  # x    current_y -= y_step  # 更新    ax_legend.plot([x_icon - 0.05, x_icon + 0.15],  # x                   [current_y, current_y],  # y                   color=color_scheme['legend_text'],  # 线色                   dashes=(2, 2),  # 虚线                   lw=4,   # 粗细                   clip_on=False)  # 防裁剪

第七部分

执行部分
# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================if __name__ == '__main__':  # 读取数据    all_vars_to_check = network_vars + scatter_vars_bottom  # 拼接列名    scheme_id = 20    selected_scheme = COLOR_SCHEMES[scheme_id]    print('正在绘制并保存方案:', scheme_id)    create_network_scatterplot_matrix(main_df, color_scheme=selected_scheme, save_path=output_directory)

如何应用到你自己的数据

1.设置原始数据的保存路径,执行部分:

data_file_path = r"data.xlsx" 

2.设置绘图结果的保存路径,执行部分:

output_directory = r"分析网络图"  # 输出目录

3.设置是否要进行批量绘图,执行部分:

plot_all = True

4.设置节点数据,基础变量设置部分:

network_vars = ['G_wmax', 'V_cmax', 'WUE_i'] 

5.设置散点图要用到的变量数据,基础变量设置部分:

scatter_vars_bottom = ['Leaf N concentration', 'Chl concentration', 'SLA', 'Stomatal density',                       'Pore length'] 

6.设置颜色配置要用到的数据,基础变量设置部分:

sites = ['CB: Cold-temperate forest', 'DL: Warm-temperate forest', 'DH: Subtropical forest',         'XSBN: Tropical forest']  

7.设置形状设置要用到的数据,基础变量设置部分:

leaf_types = ['Deciduous', 'Evergreen']

往期内容

期刊图片复现|Python绘制二维偏依赖PDP图
期刊复现|python绘制基于SHAP分析和GAM模型拟合的单特征依赖图
期刊图片复现|python绘制带有渐变颜色shap特征重要性组合图(条形图+蜂巢图)
期刊复现|用Python绘制SHAP特征重要性总览图、依赖图、双特征交互效应SHAP图,解锁XGBoost模型的终极奥秘
期刊图片复现|Python绘制shap重要性蜂巢图+单特征依赖图+交互效应强度气泡图+交互效应依赖图(回归+二分类+分类)
需要请后台私信我,注意只会分享练习数据、参考论文和代码文件,仅提供有关代码的答疑,不会提供其他答疑服务,代码文件中已经包含了每行代码的完整注释!!!

最新文章

随机文章