未经授权不得转载或抄袭。
转载合作请后台联系授权,侵权必究。

左侧:百分比堆积柱状图,显示各样品中不同组分的百分比分布
右侧:单独柱状图,显示另一关键指标(如尺寸、浓度等)
注:本文所用数据均为模拟数据,不具有实际意义。
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].valuescomponent_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_COLORfor 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()
“今日分享至此✨”
如有错误或不足之处,欢迎随时在评论区指出,感谢!
完整代码获取,见评论区。
往期推荐

求点赞
求分享
求推荐