HOWTO · Matplotlib

在 Matplotlib 中设置 X 轴刻度值

本教程介绍了如何使用 Matplotlib 中的 matplotlib.pyplot.xticks()来设置 X 轴的刻度值。

本页内容

使用 matplotlib.pyplot.xticks() 选择 X 轴刻度线的位置,也可以指定这些位置显示的文本。刻度位置表示水平坐标;它们不会改变绘制的数据,也不会设置坐标轴标题。为了让图表易于阅读,每个标签都应对应它所描述的位置和数据点。

设置 X 轴刻度位置和标签

xticks() 的第一个参数是位置序列。可选的第二个参数为每个位置提供一个标签。这两个序列的长度和顺序应保持一致。下面的示例在同一张图中展示自定义标签、数值间距、等间距索引方案,以及减少并旋转类别标签的方法。

import matplotlib.pyplot as plt

x = [1, 2, 5, 9]
y = [3, 5, 4, 8]
labels = ['Jan', 'Feb', 'May', 'Sep']
categories = ['North region', 'South region', 'East region', 'West region', 'Central region']
values = [12, 9, 14, 7, 11]

fig, axes = plt.subplots(2, 2, figsize=(10, 7))

axes[0, 0].plot(x, y, marker='o')
axes[0, 0].set_title('Custom labels')
axes[0, 0].set_xlabel('Month')
axes[0, 0].set_ylabel('Value')
plt.sca(axes[0, 0])
plt.xticks(x, labels)

axes[0, 1].plot(x, y, marker='o')
axes[0, 1].set_title('Numeric spacing')
axes[0, 1].set_xlabel('X value')
axes[0, 1].set_ylabel('Value')

index_positions = list(range(len(x)))
axes[1, 0].plot(index_positions, y, marker='o')
axes[1, 0].set_title('Evenly spaced positions')
axes[1, 0].set_xlabel('Month')
axes[1, 0].set_ylabel('Value')
axes[1, 0].set_xticks(index_positions)
axes[1, 0].set_xticklabels(labels)

axes[1, 1].bar(categories, values)
axes[1, 1].set_title('Fewer, rotated category labels')
axes[1, 1].set_ylabel('Value')
axes[1, 1].set_xticks([0, 2, 4])
axes[1, 1].set_xticklabels(categories[::2])
plt.sca(axes[1, 1])
plt.xticks(rotation=35, ha='right')

fig.tight_layout()
plt.show()

左上图将四个位置与四个月份标签一一对应;示例中可见的标签(包括月份名称)仍为英文。数值图使用实际的 x 值,因此 2 到 5 之间的距离比 1 到 2 之间更宽。左下图则使用 0 到 3 的位置,使月份在视觉上等间距,同时让每个数值仍与对应月份匹配。最后一幅图有五个柱形,但只在位置 0、2 和 4 显示标签,以减少拥挤,并将这些标签旋转后右对齐。请在安装了 Matplotlib 的 Python 环境中运行脚本;此处未提供捕获的输出。

处理间距不均匀的 X 值

数值轴表示数值之间的距离。如果测量值对应的 x 值为 1、2、5 和 9,按这些值绘图会正确地让 2 到 5 以及 5 到 9 之间的间隔更大。将刻度标签改成月份不会改变这些坐标。当距离或经过的时间很重要时,应保留这种间距。

如果目的是以相等间隔比较各个类别,可以使用索引位置(例如 range(len(x)))绘制 y 值,再将类别名称用作刻度标签。数据序列和标签必须保持相同顺序。这样会将水平尺度从数值距离改为类别顺序,因此当数值测量之间的间隔具有实际意义时,不适合采用此方法。

如果标签表示日期,应将日期值用作绘图的 x 数据,并按需设置日期刻度格式;把月份名称分配给无关的数值坐标,并不会让这些坐标变成日期。

控制刻度频率并提升标签可读性

对于较小的图表,可以向 xticks() 传入明确的位置,只显示选定的刻度。例如,plt.xticks(x[::2]) 会从有序序列中每隔一个值选取一个。当使用规则的数值尺度时,定位器可以随着视图变化选择合适的间隔。例如,从 matplotlib.ticker 导入 MultipleLocator,然后调用 ax.xaxis.set_major_locator(MultipleLocator(2)),即可请求每隔两个单位显示一个主刻度。标签代表有意义的类别时,使用明确的位置;数值轴则可使用定位器。

较长的标签可以通过 plt.xticks(rotation=35, ha='right') 旋转;ha 用于设置水平对齐方式。如果旋转后标签仍然重叠,可以增大图表宽度或减少刻度数量。tight_layout() 可以为坐标轴周围留出空间,但不会替你决定哪些刻度合适。

上面的示例在大多数子图的各个坐标轴上使用 set_xticks,并在当前坐标轴上使用 xticks 自定义标签。采用面向对象的写法时,ax.set_xticks(positions, labels) 会将操作绑定到指定坐标轴。使用 pyplot 时,如果图中有多个子图,请先选中目标坐标轴。

常见问题:设置 X 轴数值

可以在一次调用中设置位置和标签吗? 可以。将两个序列传给 plt.xticks(positions, labels),或使用 ax.set_xticks(positions, labels)。每个标签按索引对应到相应的位置。

如何减少刻度数量? 提供较短的刻度位置列表,或为规则间隔的数值刻度使用定位器。刻度频率与绘制的数据点数量是两回事。

X 轴可以使用文本类别吗? 可以。像柱状图示例那样直接绘制类别值,或者绘制数值索引位置并将类别名称设为标签。如果需要指定类别顺序或保持间距相等,可以使用后一种方法。

标签重叠时可以怎么处理? 减少显示的标签、旋转标签、将旋转后的文本右对齐,或加宽图表。这些调整只影响刻度标签,不会改变绘制的数值。