如何解决Matplotlib对比图表重叠问题并提升可读性?
解决Matplotlib双列柱状图重叠及可读性优化问题
问题分析
当前图表出现重叠,核心原因是子图间距设置过小(wspace=0.1),且第二个子图的柱状图参数(负宽度+边缘对齐)导致布局挤压。以下是修复后的代码及针对性优化方案:
修复并优化后的代码
import matplotlib.pyplot as plt # 定义数据 exhaustive_search = [72, 9139] genetic_algorithm = [52.8, 200] algorithms = ['穷举搜索', '遗传算法'] # 创建画布与子图,设置合适的画布尺寸 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6)) # 调整子图间距,避免元素重叠 fig.subplots_adjust(wspace=0.3) # 绘制执行时间柱状图 ax1.bar(algorithms, [exhaustive_search[0], genetic_algorithm[0]], width=0.6, color='#1f77b4') ax1.set_xlabel('算法类型', fontsize=12) ax1.set_ylabel('执行时间 (秒)', fontsize=12) ax1.set_title('执行时间对比', fontsize=14) # 为柱子添加数值标签 for i, v in enumerate([exhaustive_search[0], genetic_algorithm[0]]): ax1.text(i, v + 1, str(v), ha='center', fontsize=10) # 绘制解数量柱状图 ax2.bar(algorithms, [exhaustive_search[1], genetic_algorithm[1]], width=0.6, color='#ff7f0e') ax2.set_xlabel('算法类型', fontsize=12) ax2.set_ylabel('解的数量', fontsize=12) ax2.set_title('解数量对比', fontsize=14) # 为柱子添加数值标签 for i, v in enumerate([exhaustive_search[1], genetic_algorithm[1]]): ax2.text(i, v + 50, str(v), ha='center', fontsize=10) # 针对数值差距过大的情况,启用对数刻度 ax2.set_yscale('log') # 设置全局标题 fig.suptitle('穷举搜索与遗传算法性能对比', fontsize=16, y=1.02) # 自动调整布局,避免标签截断 plt.tight_layout() plt.show()
关键优化点
- 解决重叠问题:将子图间距
wspace调整为0.3,移除align='edge'和负宽度的非常规设置;添加plt.tight_layout()自动适配布局,避免标签被截断。 - 提升可读性:
- 替换为中文标签,贴合阅读习惯;
- 给每个柱子添加数值标签,直观展示具体数值;
- 针对解数量差距极大的场景,启用对数刻度,避免遗传算法的柱子被压缩至几乎不可见;
- 为两个子图的柱子设置不同颜色,区分主题;
- 增大标题、标签的字体尺寸,提升整体清晰度;
- 调整全局标题位置,避免与子图标题重叠。
内容的提问来源于stack exchange,提问作者user20417691
相关产品推荐
相关产品推荐

