多任务NLP模型评估:雷达图与堆叠柱状图组合可视化实战

📅 2026/7/12 4:13:31
多任务NLP模型评估:雷达图与堆叠柱状图组合可视化实战
当你面对一个多任务NLP分类模型需要向团队或评审委员会展示其在多个维度上的表现时传统的单一指标表格往往显得力不从心。准确率、召回率、F1分数等十几个指标堆在一起既难以快速对比又无法直观呈现模型的综合能力。这正是雷达图与堆叠柱状图组合可视化技术的用武之地。本文将带你完整复现一篇学术期刊中的多任务评估可视化方案不仅提供可直接运行的Python代码更重要的是揭示这种可视化方法背后的设计逻辑和实用技巧。1. 为什么多任务NLP评估需要组合可视化在NLP多任务学习中我们通常需要评估模型在多个任务上的表现每个任务又包含多个评估指标。传统做法是制作庞大的指标表格但这种方式存在三个明显缺陷信息过载当任务数量超过5个指标超过3个时表格数据就会变得难以快速消化对比困难无法直观看出模型在哪些任务上表现优异哪些存在短板综合评估缺失难以对模型的整体能力给出直观判断雷达图能够完美展示模型在多个维度上的相对强弱而堆叠柱状图则可以清晰呈现各任务内部指标构成。两者的组合既提供了宏观的综合视角又保留了微观的细节信息。2. 核心概念雷达图与堆叠柱状图的协同设计2.1 雷达图的适用场景与局限雷达图Radar Chart特别适合展示多维数据中各维度的相对表现。在NLP多任务评估中我们可以将每个任务作为一个维度或者将不同类型的评估指标作为维度。雷达图的优势直观显示模型在各个维度上的均衡性快速识别优势领域和薄弱环节便于多个模型之间的对比雷达图的局限维度过多时会导致图形复杂难辨不擅长展示绝对数值的大小关系难以呈现指标之间的层级关系2.2 堆叠柱状图的补充作用堆叠柱状图Stacked Bar Chart能够展示每个任务内部各个指标的构成比例正好弥补了雷达图的不足。组合使用的设计逻辑雷达图用于宏观对比展示模型在各个任务上的相对表现堆叠柱状图用于微观分析展示每个任务内部各项指标的详细构成两者结合形成完整的评估视图3. 环境准备与依赖安装在开始编码前需要确保Python环境及相关库的正确配置。推荐使用Python 3.8版本以获得最佳的兼容性和性能表现。3.1 基础环境配置# 创建并激活虚拟环境推荐 python -m venv nlp_visualization source nlp_visualization/bin/activate # Linux/Mac # nlp_visualization\Scripts\activate # Windows # 安装核心依赖 pip install matplotlib3.7.0 pip install numpy1.24.0 pip install pandas1.5.03.2 验证安装结果# verification.py import matplotlib import numpy as np import pandas as pd print(fMatplotlib版本: {matplotlib.__version__}) print(fNumPy版本: {np.__version__}) print(fPandas版本: {pd.__version__}) # 测试基本绘图功能 import matplotlib.pyplot as plt plt.figure(figsize(6, 4)) plt.plot([1, 2, 3], [1, 4, 9]) plt.title(环境测试图) plt.savefig(test_plot.png, dpi100, bbox_inchestight) print(环境验证完成测试图已保存)4. 数据准备与预处理多任务NLP评估数据通常来自模型在测试集上的表现结果。我们首先构建一个模拟数据集来演示完整的处理流程。4.1 构建模拟数据集# data_preparation.py import pandas as pd import numpy as np def create_sample_data(): 创建多任务NLP评估的模拟数据 包含5个NLP任务每个任务有4个评估指标 tasks [文本分类, 情感分析, 命名实体识别, 关系抽取, 文本摘要] metrics [准确率, 召回率, F1分数, AUC分数] # 生成模拟数据 np.random.seed(42) # 保证可重复性 data {} for task in tasks: # 为每个任务生成合理的指标值 accuracy np.random.uniform(0.75, 0.95) recall np.random.uniform(0.70, 0.90) f1 np.random.uniform(0.72, 0.92) auc np.random.uniform(0.80, 0.98) data[task] { 准确率: round(accuracy, 3), 召回率: round(recall, 3), F1分数: round(f1, 3), AUC分数: round(auc, 3) } # 转换为DataFrame df pd.DataFrame(data).T return df, tasks, metrics # 生成并查看数据 df, tasks, metrics create_sample_data() print(多任务评估数据:) print(df)4.2 数据标准化处理由于不同指标的数值范围可能差异较大我们需要进行适当的标准化处理特别是为雷达图准备数据。# data_normalization.py def normalize_data(df): 对数据进行最小-最大标准化将数值缩放到[0, 1]区间 适用于雷达图数据准备 normalized_df df.copy() for column in normalized_df.columns: min_val normalized_df[column].min() max_val normalized_df[column].max() # 避免除零错误 if max_val ! min_val: normalized_df[column] (normalized_df[column] - min_val) / (max_val - min_val) else: normalized_df[column] 1.0 # 所有值相等时设为1 return normalized_df # 应用标准化 normalized_df normalize_data(df) print(标准化后的数据:) print(normalized_df)5. 雷达图实现从基础到高级定制5.1 基础雷达图绘制# radar_chart_basic.py import matplotlib.pyplot as plt from math import pi def create_basic_radar_chart(df, tasks, metrics): 创建基础雷达图展示各任务综合表现 # 设置角度坐标雷达图是圆形的需要将指标数量等分圆周 angles [n / float(len(metrics)) * 2 * pi for n in range(len(metrics))] angles angles[:1] # 闭合图形 # 创建图形 fig, ax plt.subplots(figsize(10, 10), subplot_kwdict(projectionpolar)) # 为每个任务绘制雷达图 for i, task in enumerate(tasks): values df.loc[task].values.flatten().tolist() values values[:1] # 闭合图形 ax.plot(angles, values, o-, linewidth2, labeltask) ax.fill(angles, values, alpha0.1) # 设置角度坐标标签 ax.set_xticks(angles[:-1]) ax.set_xticklabels(metrics) # 设置y轴标签位置和格式 ax.set_ylim(0, 1) ax.set_yticks([0.2, 0.4, 0.6, 0.8, 1.0]) ax.set_yticklabels([0.2, 0.4, 0.6, 0.8, 1.0], fontsize8) ax.grid(True) # 添加图例 plt.legend(locupper right, bbox_to_anchor(1.3, 1.0)) plt.title(多任务NLP模型评估雷达图, size14, y1.08) plt.tight_layout() return fig, ax # 绘制基础雷达图 fig, ax create_basic_radar_chart(normalized_df, tasks, metrics) plt.savefig(basic_radar_chart.png, dpi300, bbox_inchestight) plt.show()5.2 高级雷达图定制基础雷达图虽然功能完整但在美观性和信息密度上还有提升空间。下面我们实现一个更符合学术出版要求的高级版本。# radar_chart_advanced.py def create_advanced_radar_chart(df, tasks, metrics, styleseaborn): 创建高级定制雷达图适合学术论文和报告使用 # 设置样式 plt.style.use(style) # 计算角度 angles [n / float(len(metrics)) * 2 * pi for n in range(len(metrics))] angles angles[:1] # 创建图形 fig plt.figure(figsize(12, 10)) ax fig.add_subplot(111, polarTrue) # 定义颜色方案 colors [#FF6B6B, #4ECDC4, #45B7D1, #96CEB4, #FECA57] # 绘制每个任务的雷达图 for i, task in enumerate(tasks): values df.loc[task].values.flatten().tolist() values values[:1] # 绘制线条和填充 ax.plot(angles, values, o-, linewidth2.5, labeltask, colorcolors[i], markersize6) ax.fill(angles, values, colorcolors[i], alpha0.25) # 美化坐标轴 ax.set_xticks(angles[:-1]) ax.set_xticklabels(metrics, fontsize11, fontweightbold) # 设置径向坐标 ax.set_ylim(0, 1) ax.set_yticks([0.2, 0.4, 0.6, 0.8, 1.0]) ax.set_yticklabels([20%, 40%, 60%, 80%, 100%], fontsize9, alpha0.7) ax.set_theta_offset(pi / 2) # 从顶部开始 ax.set_theta_direction(-1) # 顺时针方向 # 美化网格 ax.grid(True, alpha0.3) ax.set_facecolor(#FAFAFA) # 添加图例和标题 plt.legend(locupper left, bbox_to_anchor(-0.1, 1.0), fontsize10, frameonTrue, fancyboxTrue, shadowTrue, framealpha0.9) plt.title(多任务NLP模型综合评估雷达图\n, size16, fontweightbold, pad20) # 添加说明文本 fig.text(0.02, 0.02, 数据来源: 模拟多任务NLP评估实验, styleitalic, fontsize9, alpha0.7) plt.tight_layout() return fig, ax # 绘制高级雷达图 fig, ax create_advanced_radar_chart(normalized_df, tasks, metrics) plt.savefig(advanced_radar_chart.png, dpi300, bbox_inchestight, facecolorwhite, edgecolornone) plt.show()6. 堆叠柱状图实现堆叠柱状图用于展示每个任务内部各个指标的详细构成为雷达图提供细节补充。6.1 基础堆叠柱状图# stacked_bar_basic.py def create_stacked_bar_chart(df, tasks, metrics): 创建堆叠柱状图展示各任务指标构成 fig, ax plt.subplots(figsize(12, 8)) # 设置颜色方案 colors [#FF9999, #66B3FF, #99FF99, #FFD700] # 初始化底部位置 bottom np.zeros(len(tasks)) # 绘制每个指标的堆叠部分 for i, metric in enumerate(metrics): values df[metric].values ax.bar(tasks, values, bottombottom, labelmetric, colorcolors[i], alpha0.8, edgecolorwhite, linewidth0.5) bottom values # 美化图形 ax.set_ylabel(指标数值, fontsize12, fontweightbold) ax.set_title(多任务NLP模型指标堆叠柱状图, fontsize14, fontweightbold, pad20) # 设置x轴标签旋转避免重叠 plt.xticks(rotation45, haright) # 添加图例 ax.legend(locupper left, bbox_to_anchor(1.0, 1.0), frameonTrue, fancyboxTrue, shadowTrue) # 添加数值标签 for i, task in enumerate(tasks): total_height df.loc[task].sum() ax.text(i, total_height 0.02, f{total_height:.3f}, hacenter, vabottom, fontsize9) plt.tight_layout() return fig, ax # 绘制堆叠柱状图 fig, ax create_stacked_bar_chart(df, tasks, metrics) plt.savefig(stacked_bar_chart.png, dpi300, bbox_inchestight) plt.show()6.2 百分比堆叠柱状图在某些场景下我们更关心指标的比例关系而非绝对数值这时百分比堆叠柱状图更加合适。# percentage_stacked_bar.py def create_percentage_stacked_bar(df, tasks, metrics): 创建百分比堆叠柱状图 # 计算百分比 df_percentage df.div(df.sum(axis1), axis0) fig, ax plt.subplots(figsize(12, 8)) colors [#FF6B6B, #4ECDC4, #45B7D1, #FECA57] bottom np.zeros(len(tasks)) for i, metric in enumerate(metrics): values df_percentage[metric].values * 100 # 转换为百分比 bars ax.bar(tasks, values, bottombottom, labelmetric, colorcolors[i], alpha0.8, edgecolorwhite, linewidth0.5) bottom values # 在每个分段上添加百分比标签 for j, (task, value) in enumerate(zip(tasks, values)): if value 5: # 只显示足够大的百分比 ax.text(j, bottom[j] - value/2, f{value:.1f}%, hacenter, vacenter, fontsize8, fontweightbold, colorwhite) ax.set_ylabel(百分比 (%), fontsize12, fontweightbold) ax.set_title(多任务NLP模型指标百分比堆叠图, fontsize14, fontweightbold, pad20) ax.set_ylim(0, 100) plt.xticks(rotation45, haright) ax.legend(locupper left, bbox_to_anchor(1.0, 1.0)) plt.tight_layout() return fig, ax # 绘制百分比堆叠图 fig, ax create_percentage_stacked_bar(df, tasks, metrics) plt.savefig(percentage_stacked_bar.png, dpi300, bbox_inchestight) plt.show()7. 组合可视化雷达图与堆叠柱状图的协同展示将两种图表组合在一起形成完整的评估视图这是本文的核心创新点。7.1 创建组合图表布局# combined_visualization.py def create_combined_visualization(df, tasks, metrics): 创建雷达图与堆叠柱状图的组合可视化 # 创建图形和子图布局 fig plt.figure(figsize(16, 8)) # 左侧雷达图1行2列的第1个位置 ax1 fig.add_subplot(121, polarTrue) # 右侧堆叠柱状图1行2列的第2个位置 ax2 fig.add_subplot(122) # 绘制雷达图 angles [n / float(len(metrics)) * 2 * pi for n in range(len(metrics))] angles angles[:1] colors [#FF6B6B, #4ECDC4, #45B7D1, #96CEB4, #FECA57] normalized_df normalize_data(df) for i, task in enumerate(tasks): values normalized_df.loc[task].values.flatten().tolist() values values[:1] ax1.plot(angles, values, o-, linewidth2, labeltask, colorcolors[i]) ax1.fill(angles, values, colorcolors[i], alpha0.1) ax1.set_xticks(angles[:-1]) ax1.set_xticklabels(metrics) ax1.set_ylim(0, 1) ax1.set_title(任务综合能力雷达图, fontsize12, pad20) # 绘制堆叠柱状图 bottom np.zeros(len(tasks)) bar_colors [#FF9999, #66B3FF, #99FF99, #FFD700] for i, metric in enumerate(metrics): values df[metric].values ax2.bar(tasks, values, bottombottom, labelmetric, colorbar_colors[i]) bottom values ax2.set_ylabel(指标数值) ax2.set_title(任务详细指标堆叠图, fontsize12) plt.xticks(rotation45, haright) ax2.legend() # 调整布局 plt.tight_layout() plt.suptitle(多任务NLP模型综合评估可视化, fontsize16, fontweightbold, y0.98) return fig, (ax1, ax2) # 创建组合可视化 fig, (ax1, ax2) create_combined_visualization(df, tasks, metrics) plt.savefig(combined_visualization.png, dpi300, bbox_inchestight) plt.show()7.2 高级组合可视化优化针对学术出版和正式报告的需求我们对组合可视化进行进一步优化。# advanced_combined_visualization.py def create_advanced_combined_visualization(df, tasks, metrics, model_nameBERT-base): 创建适合学术出版的高级组合可视化 # 设置专业样式 plt.style.use(seaborn-v0_8-whitegrid) # 创建图形 fig plt.figure(figsize(18, 10)) # 使用GridSpec进行更精细的布局控制 gs fig.add_gridspec(2, 2, width_ratios[1, 1], height_ratios[1, 0.1]) # 雷达图左上 ax1 fig.add_subplot(gs[0, 0], polarTrue) # 堆叠柱状图右上 ax2 fig.add_subplot(gs[0, 1]) # 图例区域底部 ax_legend fig.add_subplot(gs[1, :]) ax_legend.axis(off) # 绘制优化后的雷达图 angles [n / float(len(metrics)) * 2 * pi for n in range(len(metrics))] angles angles[:1] # 专业配色方案 radar_colors [#E74C3C, #3498DB, #2ECC71, #F39C12, #9B59B6] bar_colors [#E74C3C, #3498DB, #2ECC71, #F39C12] normalized_df normalize_data(df) radar_lines [] for i, task in enumerate(tasks): values normalized_df.loc[task].values.flatten().tolist() values values[:1] line, ax1.plot(angles, values, o-, linewidth2.5, colorradar_colors[i], markersize6, labeltask) radar_lines.append(line) ax1.fill(angles, values, colorradar_colors[i], alpha0.1) # 雷达图美化 ax1.set_xticks(angles[:-1]) ax1.set_xticklabels(metrics, fontsize11, fontweightbold) ax1.set_ylim(0, 1) ax1.set_yticks([0.2, 0.4, 0.6, 0.8, 1.0]) ax1.set_yticklabels([0.2, 0.4, 0.6, 0.8, 1.0], fontsize9) ax1.grid(True, alpha0.3) ax1.set_title(f{model_name}模型多任务能力雷达图, fontsize13, fontweightbold, pad20) # 绘制优化后的堆叠柱状图 bottom np.zeros(len(tasks)) bar_handles [] for i, metric in enumerate(metrics): values df[metric].values bars ax2.bar(tasks, values, bottombottom, colorbar_colors[i], alpha0.8, edgecolorwhite, linewidth0.5) bar_handles.append(bars) bottom values # 添加数值标签 for j, (task, value) in enumerate(zip(tasks, values)): if value 0.1: # 只显示较大的数值 ax2.text(j, bottom[j] - value/2, f{value:.3f}, hacenter, vacenter, fontsize8, fontweightbold, colorwhite) # 柱状图美化 ax2.set_ylabel(评估指标数值, fontsize12, fontweightbold) ax2.set_title(各任务详细指标分解, fontsize13, fontweightbold, pad20) ax2.tick_params(axisx, rotation45) ax2.grid(True, alpha0.3, axisy) # 创建统一的图例 all_handles radar_lines [plt.Rectangle((0,0),1,1, colorbar_colors[i]) for i in range(len(metrics))] all_labels tasks metrics ax_legend.legend(all_handles, all_labels, loccenter, ncol5, frameonTrue, fancyboxTrue, shadowTrue, fontsize10) # 添加整体标题和说明 plt.suptitle(f多任务NLP模型综合评估可视化 - {model_name}, fontsize16, fontweightbold, y0.95) # 添加数据说明 fig.text(0.02, 0.02, 注雷达图数据经过最小-最大标准化处理柱状图显示原始评估数值, styleitalic, fontsize9, alpha0.7) plt.tight_layout() plt.subplots_adjust(top0.90, bottom0.15) return fig, (ax1, ax2, ax_legend) # 创建高级组合可视化 fig, (ax1, ax2, ax_legend) create_advanced_combined_visualization(df, tasks, metrics) plt.savefig(advanced_combined_visualization.png, dpi300, bbox_inchestight, facecolorwhite) plt.show()8. 实用功能扩展8.1 多模型对比可视化在实际研究中我们经常需要比较多个模型的表现。扩展我们的可视化方案来支持多模型对比。# multi_model_comparison.py def create_multi_model_comparison(model_datas, model_names, tasks, metrics): 创建多模型对比可视化 model_datas: 包含多个模型数据的列表 model_names: 模型名称列表 fig, axes plt.subplots(2, len(model_names), figsize(6*len(model_names), 10)) if len(model_names) 1: axes axes.reshape(2, 1) for i, (model_data, model_name) in enumerate(zip(model_datas, model_names)): # 雷达图 ax_radar axes[0, i] if len(model_names) 1 else axes[0] if i 0: ax_radar fig.add_subplot(2, len(model_names), i1, polarTrue) else: ax_radar fig.add_subplot(2, len(model_names), i1, polarTrue, shareyaxes[0,0]) # 绘制单个模型的雷达图 angles [n / float(len(metrics)) * 2 * pi for n in range(len(metrics))] angles angles[:1] normalized_data normalize_data(model_data) colors [#FF6B6B, #4ECDC4, #45B7D1, #96CEB4, #FECA57] for j, task in enumerate(tasks): values normalized_data.loc[task].values.flatten().tolist() values values[:1] ax_radar.plot(angles, values, o-, linewidth2, colorcolors[j], labeltask if i0 else ) ax_radar.fill(angles, values, colorcolors[j], alpha0.1) ax_radar.set_xticks(angles[:-1]) ax_radar.set_xticklabels(metrics, fontsize9) ax_radar.set_title(f{model_name}\n能力雷达图, fontsize11, pad15) # 堆叠柱状图 ax_bar axes[1, i] if len(model_names) 1 else axes[1] ax_bar fig.add_subplot(2, len(model_names), i1len(model_names)) bottom np.zeros(len(tasks)) bar_colors [#FF9999, #66B3FF, #99FF99, #FFD700] for k, metric in enumerate(metrics): values model_data[metric].values ax_bar.bar(tasks, values, bottombottom, colorbar_colors[k], alpha0.8, labelmetric if i0 else ) bottom values ax_bar.set_title(指标分解, fontsize11) ax_bar.tick_params(axisx, rotation45) # 添加统一图例 handles, labels axes[0,0].get_legend_handles_labels() fig.legend(handles, labels, loclower center, ncollen(tasks), bbox_to_anchor(0.5, 0.02), frameonTrue) plt.tight_layout() plt.subplots_adjust(bottom0.15) return fig # 示例创建两个模型的对比 model1_data df # 使用之前创建的数据作为模型1 model2_data df * 0.9 # 模拟一个稍弱的模型2 multi_fig create_multi_model_comparison([model1_data, model2_data], [BERT-base, BERT-large], tasks, metrics) plt.savefig(multi_model_comparison.png, dpi300, bbox_inchestight) plt.show()8.2 交互式可视化支持虽然静态图像适合论文出版但在数据探索阶段交互式可视化更加实用。# interactive_visualization.py import plotly.graph_objects as go from plotly.subplots import make_subplots import plotly.offline as pyo def create_interactive_combined_chart(df, tasks, metrics): 使用Plotly创建交互式组合图表 # 创建子图布局 fig make_subplots( rows1, cols2, specs[[{type: polar}, {type: bar}]], subplot_titles(多任务能力雷达图, 详细指标堆叠图) ) # 标准化数据用于雷达图 normalized_df normalize_data(df) # 添加雷达图轨迹 for i, task in enumerate(tasks): values normalized_df.loc[task].values.flatten().tolist() values.append(values[0]) # 闭合图形 fig.add_trace( go.Scatterpolar( rvalues, thetametrics [metrics[0]], filltoself, nametask, linedict(width2), opacity0.8 ), row1, col1 ) # 添加堆叠柱状图轨迹 for i, metric in enumerate(metrics): fig.add_trace( go.Bar( namemetric, xtasks, ydf[metric].values, opacity0.7, textdf[metric].values, texttemplate%{text:.3f}, textpositioninside ), row1, col2 ) # 更新布局 fig.update_layout( title多任务NLP模型交互式评估面板, polardict( radialaxisdict( visibleTrue, range[0, 1] ) ), showlegendTrue, height500, bargap0.1, bargroupgap0.1 ) return fig # 创建交互式图表 interactive_fig create_interactive_combined_chart(df, tasks, metrics) interactive_fig.show() # 保存为HTML文件 interactive_fig.write_html(interactive_visualization.html)9. 常见问题与解决方案在实际使用过程中可能会遇到各种问题。以下是常见问题及其解决方案。9.1 数据预处理问题问题1指标数值范围差异过大现象某些指标值在0.9以上某些在0.1以下导致雷达图形状失真解决方案使用合适的标准化方法如最小-最大标准化或Z-score标准化# 数据标准化优化 def robust_normalize_data(df): 使用更稳健的标准化方法处理极端值 normalized_df df.copy() for column in normalized_df.columns: # 使用百分位数避免极端值影响 q1 normalized_df[column].quantile(0.25) q3 normalized_df[column].quantile(0.75) iqr q3 - q1 # 计算稳健的最小最大值 robust_min max(normalized_df[column].min(), q1 - 1.5 * iqr) robust_max min(normalized_df[column].max(), q3 1.5 * iqr) if robust_max ! robust_min: normalized_df[column] (normalized_df[column] - robust_min) / (robust_max - robust_min) else: normalized_df[column] 0.5 # 所有值相等时设为中间值 return normalized_df问题2任务数量过多导致雷达图拥挤现象超过8个任务时雷达图线条重叠严重难以辨认解决方案分组显示或使用小型多图small multiples方式9.2 可视化效果问题问题3颜色区分度不足现象多个任务的颜色相近难以区分解决方案使用专业的颜色方案确保色盲友好# 色盲友好颜色方案 def get_colorblind_friendly_colors(n_colors): 获取色盲友好的颜色方案 # 来自ColorBrewer的定性色盘 color_schemes { set1: [#E41A1C, #377EB8, #4DAF4A, #984EA3, #FF7F00, #FFFF33, #A65628, #F781BF], set2: [#66C2A5, #FC8D62, #8DA0CB, #E78AC3, #A6D854, #FFD92F, #E5C494, #B3B3B3], set3: [#8DD3C7, #FFFFB3, #BEBADA, #FB8072, #80B1D3, #FDB462, #B3DE69, #FCCDE5] } # 循环使用颜色方案确保足够区分度 colors [] for i in range(n_colors): scheme color_schemes[list(color_schemes.keys())[i % 3]] colors.append(scheme[i % len(scheme)]) return colors问题4图表元素重叠现象标签、图例等元素相互重叠解决方案自动调整布局或手动微调# 自动调整布局 def auto_adjust_layout(fig, ax): 自动调整图表布局避免元素重叠 plt.tight_layout() # 如果仍有重叠进一步调整 try: fig.canvas.draw() # 检查标签重叠并调整 for label in ax.get_xticklabels(): label.set_ha(right) label.set_rotation(45) except: pass # 如果自动调整失败保持原样9.3 性能与输出问题问题5大数据集渲染缓慢现象数据点过多时图表渲染和保存速度很慢解决方案数据采样或使用简化渲染# 大数据集优化 def optimize_for_large_dataset(df, max_tasks10, max_metrics6): 对大数据集进行优化处理 # 如果任务过多选择最重要的 if len(df) max_tasks: # 按综合评分选择最重要的任务 df[综合评分] df.mean(axis1) df df.nlargest(max_tasks, 综合评分) df df.drop(综合评分, axis1) # 如果指标过多选择最具代表性的 if len(df.columns) max_metrics: # 保留方差较大的指标