绘制90类混淆矩阵时数值重叠,如何调整坐标轴标签间距?
嘿,这个问题我太熟了——90类的混淆矩阵简直是布局噩梦,标签挤在一起、内部数值重叠都是常有的事儿。下面给你几个实操性强的解决方案,分工具给你拆解:
方案1:Matplotlib手动精细化调整
Matplotlib虽然需要手动调参数,但灵活性最高,适合精准控制布局:
先放大画布,给标签留足空间
90类的矩阵首先得把画布尺寸拉够,不然再怎么调都挤:import matplotlib.pyplot as plt from sklearn.metrics import confusion_matrix # 假设你已经有真实标签y_true和预测标签y_pred cm = confusion_matrix(y_true, y_pred) # 20x20是起步,根据你的标签长度可以再调大到25x25 plt.figure(figsize=(20, 20)) plt.imshow(cm, cmap='Blues')旋转+缩小标签,增大轴间距
横向标签旋转90度是避免重叠的关键,同时调小字体、增加标签和轴的距离:# 调整x轴标签:旋转90度,缩小字体,设置对齐方式 plt.xticks(range(90), [f'Class {i}' for i in range(90)], rotation=90, fontsize=8, ha='center', va='top') # y轴标签保持横向,调整右对齐避免和矩阵重叠 plt.yticks(range(90), [f'Class {i}' for i in range(90)], fontsize=8, ha='right') # 增加标签与轴的间距,彻底避免挤在一起 plt.tick_params(axis='x', pad=10) plt.tick_params(axis='y', pad=10)优化内部数值显示,只保留关键信息
90类矩阵里很多数值是0,只显示非零值能大幅减少重叠:# 遍历矩阵添加数值文本,只显示非零值,同时调小字体 for i in range(cm.shape[0]): for j in range(cm.shape[1]): if cm[i,j] != 0: plt.text(j, i, cm[i,j], ha='center', va='center', fontsize=6)自动调整布局
最后用tight_layout()让Matplotlib自动优化元素位置:plt.tight_layout() plt.show()
方案2:Seaborn Heatmap一键简化调整
Seaborn的heatmap封装了很多布局逻辑,比Matplotlib省心:
import seaborn as sns plt.figure(figsize=(22, 22)) # annot=True显示数值,fmt='d'表示整数格式,annot_kws直接控制标注字体大小 ax = sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=[f'Class {i}' for i in range(90)], yticklabels=[f'Class {i}' for i in range(90)], annot_kws={"size": 6}) # 调整标签样式和间距 ax.set_xticklabels(ax.get_xticklabels(), rotation=90, fontsize=8, ha='center', pad=12) ax.set_yticklabels(ax.get_yticklabels(), fontsize=8, va='center', pad=12) plt.tight_layout() plt.show()
进阶方案:交互式可视化彻底解决重叠
如果静态图怎么调都挤,试试Plotly的交互式热图——鼠标悬停就能查看具体数值,不用把所有数值都堆在图里:
import plotly.figure_factory as ff fig = ff.create_annotated_heatmap(cm, x=[f'Class {i}' for i in range(90)], y=[f'Class {i}' for i in range(90)], annotation_text=cm, colorscale='Blues') # 调整画布大小和标签样式 fig.update_layout(width=1200, height=1200) fig.update_xaxes(tickangle=90, tickfont=dict(size=8)) fig.update_yaxes(tickfont=dict(size=8)) fig.show()
核心思路总结:先放大画布给元素留空间,再通过缩小字体、旋转标签减少横向挤压,最后优化内部数值显示(或用交互式工具)彻底解决重叠问题。
内容的提问来源于stack exchange,提问作者Akhan
相关产品推荐
相关产品推荐

