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

Pyplot中x轴为字符串时如何限制显示的xticks数量?

解决Matplotlib类别型x轴限制刻度数量并支持缩放的问题

当x轴为字符串类别时,默认的StrCategoryLocator不支持locator_params的nbins参数,而MaxNLocator会在类别间生成无效刻度。可以通过自定义基于类别索引的定位器实现需求:

  • 利用类别内部映射的索引(0,1,2...)作为数值基础
  • 结合MaxNLocator动态计算合适的刻度数量
  • 过滤掉不存在的类别索引,确保只显示有效类别标签

完整代码示例

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncLocator, MaxNLocator

fig, ax = plt.subplots()

x_values = [f"Text{value}" for value in np.arange(25)]
y_values = np.random.randint(5, 10, 25)

ax.scatter(x_values, y_values)
ax.grid(True)

# 自定义类别定位器:动态计算并返回有效类别索引
def get_category_ticks(axis):
    # 获取当前视图的x轴索引范围
    vmin, vmax = axis.get_view_interval()
    # 用MaxNLocator计算目标刻度数量(这里设为5),强制整数刻度
    locator = MaxNLocator(nbins=5, integer=True)
    raw_locs = locator.tick_values(vmin, vmax)
    # 过滤出属于现有类别的索引
    valid_locs = [loc for loc in raw_locs if 0 <= loc < len(x_values)]
    return valid_locs

# 设置主定位器为自定义函数
ax.xaxis.set_major_locator(FuncLocator(lambda x, pos: get_category_ticks(ax.xaxis)))
# 更新刻度标签为对应字符串
ax.set_xticklabels([x_values[int(loc)] for loc in ax.get_xticks()])

plt.show()

效果说明

  1. 默认显示约5个x轴刻度,避免标签重叠
  2. 缩放图表时,定位器会根据当前显示的类别范围自动调整刻度数量,仅显示有效类别标签,不会出现类别间的无效刻度
  3. 所有刻度均对应实际存在的字符串类别,符合需求

内容的提问来源于stack exchange,提问作者Alex V.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 21:42:36