You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib自定义X轴刻度问题:刻度与数据点错位

Matplotlib自定义X轴刻度与数据点对齐问题解决

问题根源

你当前用np.arange(0, max(train_set_sizes)+1, 1000)生成均匀间隔的X轴刻度,但train_set_sizes本身是非均匀分布的数值(比如从10跳到50,再到100,之后到500),这种均匀刻度会导致刻度线和实际数据点的位置错位。

解决方案

方案1:直接使用train_set_sizes作为X轴刻度

将X轴刻度直接设置为你的训练集大小列表,同时调整显示参数避免重叠:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import MultipleLocator
import scienceplots

accuracies = [
    0.3244, 0.5753, 0.6866, 0.7644,
    0.7955, 0.8114, 0.8369, 0.8366,
    0.8742, 0.8633, 0.9151, 0.9321,
    0.9528, 0.9523, 0.9625, 0.9651,
    0.9688, 0.9764, 0.9787, 0.9843,
    0.9863, 0.9904, 0.9912, 0.9907,
    0.9918, 0.9934, 0.9926, 0.9934
]

training_set_sizes = [
    10, 50, 100, 500, 600, 700, 800, 900, 1000, 2000,
    3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 15000,
    20000, 30000, 40000, 50000, 60000, 70000, 80000, 85000,
    90000, 95000, 100000, 105000, 110000, 115000, 120000, 125000,
    130000, 135000, 140000, 145000, 150000
]

train_set_sizes = training_set_sizes[0:28]

with plt.style.context(['science']):
    plt.figure(figsize=(20, 10))
    # 加上marker='o'更清晰看到数据点位置
    plt.plot(train_set_sizes, accuracies, color='#AD7CAD', linewidth=4.0, marker='o')
    plt.xlabel("训练集大小")
    plt.ylabel("F1分数")
    # 直接设置X轴刻度为train_set_sizes,调整旋转角度、对齐方式和字体大小
    plt.xticks(train_set_sizes, rotation=60, ha="right", fontsize=8)
    ax = plt.gca()
    plt.grid(color='lightgray', linestyle='--', linewidth=0.5, axis='both', which='both')
    # 自动调整布局,防止刻度被截断
    plt.tight_layout()
    plt.show()

方案2:筛选关键刻度(避免过多刻度重叠)

如果不想显示全部28个刻度,可以筛选出关键数值(比如小样本量或整千/整万的数值)作为刻度:

# 其他代码与方案1一致,仅修改xticks部分
with plt.style.context(['science']):
    plt.figure(figsize=(20, 10))
    plt.plot(train_set_sizes, accuracies, color='#AD7CAD', linewidth=4.0, marker='o')
    plt.xlabel("训练集大小")
    plt.ylabel("F1分数")
    # 筛选关键刻度:保留小于1000的小样本量,以及整千的样本量
    key_ticks = [s for s in train_set_sizes if s < 1000 or s % 1000 == 0]
    plt.xticks(key_ticks, rotation=45, ha="right")
    ax = plt.gca()
    plt.grid(color='lightgray', linestyle='--', linewidth=0.5, axis='both', which='both')
    plt.tight_layout()
    plt.show()

为什么原代码会错位?

原代码中np.arange(0, max(train_set_sizes)+1, 1000)生成的是均匀间隔的刻度值(0、1000、2000...),但你的数据点分布在10、50、100这些非均匀的位置上,导致刻度线和数据点的X轴坐标不匹配,视觉上就出现了错位。

内容的提问来源于stack exchange,提问作者rk___

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:05:11