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___
相关产品推荐
相关产品推荐

