matplotlib 2.1.2搭配pandas如何设置x轴自定义顺序避免按字母排序
问题原因
matplotlib 2.1.2版本中,直接向plt.plot()传入字符串类型的x轴序列时,会默认对字符串执行字典序排序后再映射坐标轴位置,因此即便你的DataFrame已经提前按数值排好顺序,传入字符串标签作为x参数时依然会被打乱顺序。你添加数字前缀后依然排序错误,是因为字符串的字典序规则下"10"会排在"2"前面,和数值排序逻辑不一致。
解决方法
核心思路是先使用位置索引作为x坐标绘制图形,再手动替换x轴刻度标签,完全绕开matplotlib的自动排序逻辑:
- 基础测试用例调整代码:
# 原有排序逻辑保持不变 df1 = pd.DataFrame({'Col1': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L'], 'Col2': [0, 1, -1, 4, 2, 3, -2 , -3, 5, -5, 6, 7] }) df1.sort_values('Col2', inplace=True) df1.reset_index(drop=True, inplace=True) # 调整绘图逻辑 plt.plot(range(len(df1)), df1.Col2) # 手动设置x轴刻度标签为df1中Col1的顺序 plt.xticks(range(len(df1)), df1.Col1)
- WoE绘图函数调整版本:
# 编写基于WoE绘图的函数 def plot_by_woe(df_WoE, rotation_of_x_axis_labels=0): # 直接用位置索引作为x坐标,避免字符串自动排序 x = np.arange(len(df_WoE)) x_labels = np.array(df_WoE.iloc[:, 0].apply(str)) y = df_WoE['WoE'] plt.figure(figsize= (18,6)) plt.plot(x, y, marker='o', linestyle = '--', color = 'k') # 手动替换x轴刻度标签 plt.xticks(x, x_labels, rotation = rotation_of_x_axis_labels) plt.xlabel(df_WoE.columns[0]) plt.ylabel('WoE') plt.title(str('WoE by ' + df_WoE.columns[0]))
该方案完全兼容matplotlib 2.1.2版本,无需升级依赖,x轴顺序会和传入的DataFrame行顺序完全一致。
内容的提问来源于stack exchange,提问作者BuJay
相关产品推荐
相关产品推荐

