当前位置:首页>python>Python| 左侧百分比堆积柱状图+右侧柱状图(组合图)

Python| 左侧百分比堆积柱状图+右侧柱状图(组合图)

  • 2026-10-21 13:28:30
Python| 左侧百分比堆积柱状图+右侧柱状图(组合图)

未经授权不得转载或抄袭。

转载合作请后台联系授权,侵权必究。

    

左侧:百分比堆积柱状图,显示各样品中不同组分的百分比分布

右侧:单独柱状图,显示另一关键指标(如尺寸、浓度等)

注:本文所用数据均为模拟数据,不具有实际意义。

01

 导入库和数据加载

导入库

import matplotlib.pyplot as pltimport numpy as npimport pandas as pd

数据加载

# 读取CSV文件data_df = pd.read_csv(INPUT_CSV_FILE)# 列名配置(根据实际文件修改)SAMPLE_NAME_COLUMN = 'Sample'  # 样本名称列名RIGHT_PLOT_VALUE_COLUMN = 'Size'  # 右侧图表数值列名all_columns = data_df.columns.tolist()excluded_columns = [SAMPLE_NAME_COLUMN, RIGHT_PLOT_VALUE_COLUMN]component_columns = [col for col in all_columns if col not in excluded_columns]

02

双图绘制

创建图表布局

# 创建1行2列的子图fig, (left_ax, right_ax) = plt.subplots(1, 2, figsize=(5, 6))

左图

total_components = data_df[component_columns].sum(axis=1).values # 计算每个样本的组分总量(用于百分比计算)y_positions = np.arange(len(data_df))  # Y轴位置(样本索引)bottom_values = np.zeros(len(data_df))  # 堆积柱状图起始位置# 绘制每个组分的堆积柱状图for idx, (component, color) in enumerate(zip(component_columns, component_colors)):    # 计算当前组分百分比    component_values = data_df[component].values    component_percentages = (component_values / total_components) * 100    # 绘制横向堆积柱    left_ax.barh(        y_positions,        component_percentages,        left=bottom_values,        color=color,        label=component,        edgecolor='white',        height=0.9,        linewidth=0    )    # 更新堆积底部位置    bottom_values += component_percentages# 左侧子图样式设置left_ax.set_xlabel('Percentage (%)', fontsize=14, fontweight='bold')left_ax.set_xlim(0, 100)  # 百分比范围0-100%left_ax.set_yticks(y_positions)left_ax.set_yticklabels(data_df[SAMPLE_NAME_COLUMN], fontsize=12, fontweight='bold')left_ax.set_ylim(-0.75, len(data_df) - 0.25)

右图

# 获取右侧图表数值right_values = data_df[RIGHT_PLOT_VALUE_COLUMN].values# 为每个柱子分配颜色:小于20的用粉红色,其他的用默认颜色bar_colors = [    RIGHT_PLOT_HIGHLIGHT_COLOR if value < THRESHOLD else RIGHT_PLOT_COLOR    for value in right_values]# 绘制右侧柱状图,使用不同的颜色right_ax.barh(    y_positions,    right_values,    color=bar_colors,    height=0.9,    linewidth=0,    alpha=0.9)# 右侧子图样式设置right_ax.set_xlabel(RIGHT_PLOT_VALUE_COLUMN, fontsize=14, fontweight='bold')right_ax.set_xlim(0, 40)right_ax.set_ylim(-0.75, len(data_df) - 0.25)  # 与左侧Y轴对齐right_ax.set_yticks([])  # 隐藏Y轴刻度# 添加阈值参考线right_ax.axvline(    x=THRESHOLD,    color='#D6D6D6',    linestyle='--',    linewidth=1,    alpha=0.7,    zorder=0)# 添加阈值标注right_ax.text(    THRESHOLD + 0.5,  # X位置    len(data_df) - 0.5,  # Y位置(顶部)    f'Threshold: {THRESHOLD}',  # 标注文字    fontsize=10,    fontstyle='italic',    color='#C6C6C6',    va='top')

03

图例设置

# 获取图例句柄和标签legend_handles, legend_labels = left_ax.get_legend_handles_labels()# 添加图例到图表底部legend = fig.legend(    legend_handles,    legend_labels,    loc='lower center',    bbox_to_anchor=(0.5, 0.01),    ncol=min(3, len(legend_labels)),    fontsize=12,    frameon=False)

04

布局调整

plt.subplots_adjust(    left=0.20,  # 左侧边距    right=0.85,  # 右侧边距    top=0.85,  # 顶部边距    bottom=0.15,  # 底部边距(为图例留空间)    wspace=0.2  # 子图水平间距)

05

保存图片

# 定义输出文件名称output_file = '2.png'# 保存图片,设置分辨率600dpi,紧凑布局plt.savefig(output_file, dpi=600, bbox_inches='tight')# 显示图形plt.show()

“今日分享至此✨”

如有错误或不足之处,欢迎随时在评论区指出,感谢!

完整代码获取,见评论区。

往期推荐

Origin| 三维柱状图(3D并列条状图)

求点赞

求分享

求推荐

最新文章

随机文章