当前位置:首页>python>Python绘制带有误差线和显著性标记的环形柱状图

Python绘制带有误差线和显著性标记的环形柱状图

  • 2026-10-11 07:44:55
Python绘制带有误差线和显著性标记的环形柱状图

代码绘制成果展示

成果图
此图用于对比展示不同实验处理下多项测量指标的统计分析结果。整个图表被均等地划分为10个独立扇区,最外侧标注了代表不同指标。图表的右上角放置了图例,指明了扇区内部四种颜色的柱子分别对应CK、Cd、GSH和GSH+Cd四种不同的实验处理组别,柱子的径向长度直接反映了相应组别在该指标下的平均值。每个扇区侧边缘均标注了专门针对该特定指标量纲独立计算的刻度范围数值,并向右侧延伸出三条同心圆弧虚线作为辅助阅读的网格线。在每根柱子的最顶端都精准地绘制了带有上下帽线的黑色误差线,用以呈现该组数据的离散程度或变异情况;在每一条误差线的上方还标注了如a、b、c等字母,用于表示多重比较后统计学显著性差异的标记。
多种配色

代码解释

第一部分

库的导入以及字体设置
# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import matplotlibimport matplotlib.pyplot as pltimport matplotlib.patches as patchesimport numpy as npimport pandas as pd

第二部分

设置颜色库
# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {    1: {        'bg': ['#CCCCFF', '#CCFFCC', '#FFFFCC', '#99FFFF', '#99CCFF', '#FFCCFF', '#66FFCC', '#CCFFCC', '#FF9966',               '#FFCC33'],        'bars': ['#00CC99', '#FF3300', '#CCFFFF', '#66ff66']    },

第三部分

绘图函数:基础参数的设置
# =========================================================================================# ======================================3.绘图函数=======================================# =========================================================================================def plot_advanced_forest_chart(df, scheme_id):    n_segments = 10  # 扇区数    outer_radius = 1.0  # 圆环最大半径    selected_colors = COLOR_SCHEMES[scheme_id]  #提取配色方案    your_manual_colors = selected_colors['bg']  #背景色    num_bars_per_group = 4  #扇区内柱子数    treatment_colors = selected_colors['bars']  #柱子色    treatment_labels = ["CK", "Cd", "GSH", "GSH+Cd"]  #图例文本    intra_bar_gap_factor = 0.1  #相邻柱子之间间隔因子    plot_data = []  #用来各个扇区的绘图数据

第四部分

绘图函数:数据的提取
    #逐行遍历每个扇区数据    for _, row in df.iterrows():        metric_label = row['Metric']  #分区        means = [row['Mean_1'], row['Mean_2'], row['Mean_3'], row['Mean_4']]  #柱子数据        errors = [row['Error_1'], row['Error_2'], row['Error_3'], row['Error_4']]  #误差棒        sig_letters = [row['Sig_1'], row['Sig_2'], row['Sig_3'], row['Sig_4']]  #显著性        #刻度范围        segment_min = row['Min']        segment_max = row['Max']        #保存        plot_data.append((metric_label, means,errors,sig_letters,segment_min,segment_max))

第五部分

绘图函数:扇区角度计算
    ring_radial_width = outer_radius - inner_radius  #圆环总宽度    total_gap_degrees = n_segments * gap_degree  #所有的空白隔离间隙占据的总角度数值    total_segment_degrees = 360.0 - total_gap_degrees  #计算出可用于扇形绘制的总有效度数    segment_degree = total_segment_degrees / n_segments  #平分给每个扇形    available_bar_angle = segment_degree - 2 * side_padding_degree  #柱子可用角度    segment_start_angles = [center - segment_degree / 2.0 for center in segment_center_angles]  #扇区起始边界角    segment_end_angles = [center + segment_degree / 2.0 for center in segment_center_angles]  #扇区结束边界角

第六部分

绘图函数:创建画布,基础设置,遍历开始绘制各个背景扇区图形和外侧的圆弧条
    #创建画布    fig, ax = plt.subplots(figsize=(10, 10))    ax.set_aspect('equal', adjustable='box')  #宽高比例    figure_outermost_radius = outer_radius + outer_arc_radial_gap + outer_arc_thickness  #图最大半径    lim = (figure_outermost_radius + 0.03) * 1.02  #图最大范围    #设置x、y轴范围    ax.set_xlim(-lim, lim)    ax.set_ylim(-lim, lim)    ax.axis('off')  #去掉默认刻度线等        #创建外侧圆弧条        outer_arc_wedge = patches.Wedge(            center=(0, 0),  #原点            r=arc_r_outer,  #半径            theta1=segment_start_angle,  #起始角度            theta2=segment_end_angle,  #结束角度            width=outer_arc_thickness,  #厚度            facecolor=segment_bg_color,  #填充色            alpha=1.0,  #透明度            edgecolor='black',  #边框颜色            linewidth=outer_arc_linewidth,  #边框粗细            zorder=1  #层        )        ax.add_patch(outer_arc_wedge)  #添加到图上        current_bar_start_angle = segment_start_angle + side_padding_degree  #第一根柱子角度

第七部分

绘图函数:绘制柱子部分以及添加显著性的标记
        #遍历绘制柱子        for j in range(num_bars_per_group):            bar_radial_thickness = max(0, bar_top_radius - inner_radius)  #柱子实际最长范围            bar_theta1 = current_bar_start_angle  #当前柱子起始角            bar_theta2 = current_bar_start_angle + bar_angular_unit_width  #结束角            bar_center_angle_deg = bar_theta1 + bar_angular_unit_width / 2.0  #中间角度            center_angle_rad = np.radians(bar_center_angle_deg)  #转换为弧度值            ax.text(sig_x,  #x                    sig_y,  #y                    sig_letter,  #文本                    ha='center',  #水平                    va='center',  #竖直                    fontsize=sig_fontsize,  #字体大小                    color='black',  #颜色                    rotation=calculated_sig_rotation,  #旋转角度                    rotation_mode='anchor',  #旋转锚点                    zorder=6)  #层            current_bar_start_angle += bar_angular_unit_width + intra_bar_gap_angle  #更新柱子起始角

第八部分

绘图函数:绘制辅助虚线以及添加外侧的刻度标注、扇区名称等
        value_range = segment_max - segment_min  #数据范围        annotation_fractions = [0.25, 0.5, 0.75]  #刻度位置        annotation_values = [segment_min + frac * value_range for frac in annotation_fractions]  #对应刻度数        # 调用辅助函数映射数值        internal_radii = [scale_value_to_radius(val, segment_min, segment_max, inner_radius, plotting_outer_radius) for val in annotation_values]            # 设置旋转角            if 90 < angle_norm < 270:                final_rotation = target_text_angle_deg + 180                va_annot = 'bottom'            else:                final_rotation = target_text_angle_deg + 180                va_annot = 'bottom'            ax.text(annot_x,  #x                    annot_y,  #y                    annot_text,  #文本                    ha='center',  #水平                    va=va_annot,  #垂直                    fontsize=annotation_fontsize,  #字体大小                    color='black',  #颜色                    rotation=final_rotation,  #旋转角                    rotation_mode='anchor',  #锚点                    bbox=dict(boxstyle="square,pad=0.3",#内边距                              facecolor="none",  #去掉框                              edgecolor="none"),  #去掉填充色                    zorder=4)  #层

第九部分

绘图函数:绘制图例,绘图结果保存
   legend_handles = [plt.Line2D([0],  #占位                                 [0],  #占位                                 marker='s',  #点形状                                 color='w',  #线颜色                                 markerfacecolor=color,  #填充色                                 markersize=legend_fontsize * 0.8,  #大小                                 linestyle='None',  #线样式                                 label=label) for color, label in                      zip(treatment_colors, treatment_labels)]  #文本    #添加图例    ax.legend(handles=legend_handles,  #句柄              loc='upper right',  #位置              fontsize=legend_fontsize,  #大小              handletextpad=0.02,  #文本与形状间隔              frameon=False)  #去掉边框

第十部分

执行部分
# =========================================================================================# ======================================4.主程序执行=======================================# =========================================================================================if __name__ == "__main__":    df = pd.read_excel(r'data.xlsx')#读取原始数据    #设置是否进行批量绘图    plot_all = True    if plot_all:        for scheme_id in COLOR_SCHEMES.keys():            selected_hex_colors = COLOR_SCHEMES[scheme_id]            print('正在绘制并保存方案:', scheme_id)            plot_advanced_forest_chart(df, scheme_id)    else:        scheme_id = 1        selected_hex_colors = COLOR_SCHEMES[scheme_id]        print('正在绘制并保存方案:', scheme_id)        plot_advanced_forest_chart(df, scheme_id)

如何应用到你自己的数据

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

df = pd.read_excel(r'data.xlsx')#读取原始数据

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

plot_all = True

3.设置图例文本,绘图函数部分:

treatment_labels = ["CK", "Cd", "GSH", "GSH+Cd"]  #图例文本

4.设置绘图结果的保存地址,绘图函数部分:

plt.savefig(fr'{scheme_id}.png',dpi=300)

推荐

期刊图片复现|Python绘制二维偏依赖PDP图
期刊复现|python绘制基于SHAP分析和GAM模型拟合的单特征依赖图
期刊图片复现|python绘制带有渐变颜色shap特征重要性组合图(条形图+蜂巢图)
期刊复现|用Python绘制SHAP特征重要性总览图、依赖图、双特征交互效应SHAP图,解锁XGBoost模型的终极奥秘
期刊图片复现|Python绘制shap重要性蜂巢图+单特征依赖图+交互效应强度气泡图+交互效应依赖图(回归+二分类+分类)

获取方式

公众号中的所有所有的免费代码都已经下架了,都并入到付费部分里了,付费合集代码和数据的购买通道已经开通,全部合集100元,后续将会持续更新,决定购买请后台私信我,注意只会分享练习数据和代码文件,不会提供答疑服务,代码文件中已经包含了每行代码的完整注释,购买前请确保真的需要!!!

最新文章

随机文章