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

Matplotlib绘制小时数据时无法显示全部X轴刻度标签求助

问题:Matplotlib/Seaborn绘图时显示0-23全部X轴刻度标签

数据序列

hour
0     35845
1     18921
2     14484
3     12504
4     13862
5     14958
6     23328
7     33580
8     66878
9     65291
10    61785
11    64781
12    68799
13    72486
14    83230
15    75487
16    88231
17    85383
18    75525
19    61739
20    51696
21    43215
22    38539
23    30797
dtype: int64

该序列由df_hour = df.groupby("hour").size()生成,其中df是包含Int64类型"hour"列(值范围0-23)的DataFrame。

基础绘图代码

import matplotlib.pyplot as plt  # 修正原代码导入错误
import seaborn as sb

fig, ax = plt.subplots()
plt.title("Collision by hour")
sb.lineplot(x=df_hour.index,
            y=df_hour.values)

遇到的问题

运行上述代码后,图表仅显示5个X轴刻度标签,无法展示0到23的全部小时刻度。

已尝试的方法

  • 使用mdate.AutoDateLocator和ConciseDateFormatter:缺失奇数小时刻度,且出现额外首尾界限
  • 使用mdate.HourLocator和DateFormatter:X轴刻度标签无法正常读取
  • 调用ax.set_xticklabels(df["hour"]):仅显示右侧X轴刻度标签
  • 手动传入刻度列表调用ax.set_xticklabels:仅显示左侧X轴刻度标签

解决方案

直接通过Matplotlib的set_xticks方法指定所有刻度位置即可,无需使用日期相关定位器(此处hour为普通整数,非时间类型):

import matplotlib.pyplot as plt
import seaborn as sb

fig, ax = plt.subplots()
plt.title("Collision by hour")
sb.lineplot(x=df_hour.index,
            y=df_hour.values)

# 设置X轴刻度为0到23的所有整数
ax.set_xticks(range(24))
# 可选:旋转标签避免重叠
ax.tick_params(axis='x', rotation=45)

plt.show()

说明

df_hour.index本身就是0-23的整数序列,直接用range(24)指定刻度位置即可。之前误用日期定位器是问题核心,因为日期工具仅适用于时间戳类型数据。另外原代码中import matplotlib as plt为错误写法,已修正为标准导入方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:45:30