Plotly带注释热图绘制混淆矩阵时Y轴顺序受标签数据类型影响问题咨询
问题根源
Plotly的坐标轴默认会根据传入标签自动判定轴类型,不同类型的轴排序规则完全不同:
- 数字类标签(哪怕转成字符串)会被判定为数值轴,默认从下到上按数值升序排列
- 纯字符类标签会被判定为分类轴,默认从上到下按传入顺序排列,刚好和数值轴的方向相反,这就是两张图Y轴倒置的核心原因。
解决方法
只需要在update_layout的Y轴配置里,强制统一轴类型为分类轴,并且显式指定排序规则和顺序,不管传入的标签是什么类型,都能保持一致的显示效果。
修改后的完整代码
import numpy as np import plotly.graph_objects as go import plotly.figure_factory as ff # 修正原代码遗漏的np前缀,否则会报错 confm = np.array([[10, 4, 0, 1, 0], [1, 20, 10, 1, 0], [0, 7, 30, 3, 0], [0, 1, 1, 40, 2], [1, 1, 2, 2, 50]]) def plot_matrix(confm, class_names): z = np.round(confm, 2) class_names = [str(c) for c in class_names] # 强制转字符串 y_order = class_names[::-1] # 提前定义预期的Y轴顺序 fig = ff.create_annotated_heatmap(z, colorscale='reds', x=class_names, y=y_order ) fig.update_layout( title='Confusion matrix', width=600, height=600, margin=dict(pad=20), plot_bgcolor='white', xaxis=dict(title='Prediction', type='category', categoryorder='array', categoryarray=class_names, showticklabels = True, side='bottom'), yaxis=dict(title='Truth', type='category', # 强制为分类轴,避免自动判定类型导致逻辑差异 categoryorder='array', # 按指定数组排序 categoryarray=y_order, # 显式指定排序顺序,完全匹配传入列表 showticklabels=True) ) fig.show() plot_matrix(confm, [1, 2, 3, 4, 5]) plot_matrix(confm, ['a', 'b', 'c', 'd', 'e'])
关键修改说明
- 移除了原来冗余的
tickvals、ticktext配置,换成分类轴专属的排序控制参数 - 强制X/Y轴都为
category类型,彻底屏蔽Plotly自动判定轴类型的逻辑 - 通过
categoryorder='array'和categoryarray直接指定轴的显示顺序,完全和传入列表的自定义顺序一致,不受标签数据类型影响
内容的提问来源于stack exchange,提问作者StephanT
相关产品推荐
相关产品推荐

