如何基于分类列创建子图并利用颜色映射区分线条?
双分组子图可视化修复方案
原尝试的子图代码存在布局逻辑错误、分组绘制逻辑缺失、X轴刻度未配置、颜色映射未应用等问题,以下是修正后的完整实现方案:
修正后的完整代码
import matplotlib.pyplot as plt import numpy as np cluster_filter = 1 tfo_filtered_cluster_df = tfo_labeled_df[tfo_labeled_df['CLUSTER_ID'] == cluster_filter] # 复用去重图例函数,避免重复标签 def legend_without_duplicate_labels(ax): handles, labels = ax.get_legend_handles_labels() unique = [(h, l) for i, (h, l) in enumerate(zip(handles, labels)) if l not in labels[:i]] ax.legend(*zip(*unique), bbox_to_anchor=(1.05, 1), loc='upper left') # 创建1行2列的统一画布,适配两个分组维度 fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(40, 20), layout='constrained') x_vars = tfo_filtered_cluster_df.columns[5:] # 获取96个变量列 x_ticks = range(len(x_vars)) # -------------------------- # 第一个子图:按YEAR_SEASON分组可视化 # -------------------------- group_season = tfo_filtered_cluster_df.groupby(['YEAR_SEASON']) season_unique = tfo_filtered_cluster_df['YEAR_SEASON'].unique() color_map_season = plt.cm.get_cmap('Paired', len(season_unique)) color_dict_season = dict(zip(season_unique, color_map_season(np.arange(len(season_unique))))) for name, group in group_season: y_data = group.loc[:, x_vars].T ax1.plot(x_ticks, y_data, label=name, color=color_dict_season[name]) ax1.set_title('按 YEAR_SEASON 分组', fontsize=18) ax1.set_xticks(x_ticks) ax1.set_xticklabels(x_vars, rotation=90) ax1.tick_params(axis='x', labelsize=12) legend_without_duplicate_labels(ax1) # -------------------------- # 第二个子图:按MEASURE_DAY分组可视化 # -------------------------- group_day = tfo_filtered_cluster_df.groupby(['MEASURE_DAY']) day_unique = tfo_filtered_cluster_df['MEASURE_DAY'].unique() color_map_day = plt.cm.get_cmap('tab20', len(day_unique)) # 适配较多分组数量的颜色映射 color_dict_day = dict(zip(day_unique, color_map_day(np.arange(len(day_unique))))) for name, group in group_day: y_data = group.loc[:, x_vars].T ax2.plot(x_ticks, y_data, label=name, color=color_dict_day[name]) ax2.set_title('按 MEASURE_DAY 分组', fontsize=18) ax2.set_xticks(x_ticks) ax2.set_xticklabels(x_vars, rotation=90) ax2.tick_params(axis='x', labelsize=12) legend_without_duplicate_labels(ax2) # 设置总标题,明确对应Cluster fig.suptitle(f'Cluster {cluster_filter+1} 双维度分组可视化', fontsize=20, y=1.02) plt.show()
关键修正说明
- 布局优化:直接创建1行2列的子图,避免循环创建子图的布局混乱问题
- 颜色映射应用:为两个分组分别生成独立的颜色字典,YEAR_SEASON用
Paired,MEASURE_DAY用tab20(适配更多分组数量),确保同分组线条颜色统一 - X轴修复:明确设置X轴刻度为变量列索引,添加变量标签并旋转90度,同时调整刻度字号提升可读性
- 分组绘制逻辑:按目标分组(YEAR_SEASON/MEASURE_DAY)遍历数据,每个分组下的所有样本用对应颜色绘制,解决线条显示异常问题
- 图例优化:复用去重图例函数,并将图例放在子图外侧,避免遮挡线条内容
内容的提问来源于stack exchange,提问作者mnt mnt
相关产品推荐
相关产品推荐

