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

Matplotlib绘图如何将X轴时间刻度单位从小时改为月份

X轴从小时单位改为月份单位的实现方案

你现有代码里的蓝色标记点间隔刚好为720小时(即30天,对应常规简化的月时长单位),可以根据需求选择以下两种实现方式:


方案1:固定30天/月换算(代码改动最小,适配现有标记点)

直接将所有小时数值除以720得到对应月份值,不需要改动原始数据,和你当前设置的散点位置完全匹配:

import numpy as np
import matplotlib.pyplot as plt

plt.figure()
plt.title('Nitrogen content')

# 原始氮含量数据按小时采样,索引对应小时数,除以720转换为月份单位
hour_seq = np.arange(len(sugar_kelp_field.N_content_list))
month_seq = hour_seq / 720
plt.plot(month_seq, sugar_kelp_field.N_content_list)

# 原有散点的X值统一除以720,转换为月份坐标
plt.plot(1, 0.0150, 'bo')
plt.plot(2, 0.0205, 'bo')
plt.plot(3, 0.0265, 'bo')
plt.plot(4, 0.0283, 'bo')
plt.plot(5, 0.0234, 'bo')
plt.plot(6, 0.0181, 'bo')
plt.plot(7, 0.0142, 'bo')
plt.plot(8, 0.0097, 'bo')
plt.plot(9, 0.0083, 'bo')

# 更新X轴标签,设置整数月刻度方便阅读
plt.xlabel("time [month]")
plt.xticks(np.arange(0, 11, 1))  # 刻度范围可根据你的实际总运行时长调整
plt.ylabel("nitrogen content [fraction of dw]")

plt.show()

说明:如果你的采样间隔不是1小时/个数据点,只需要调整换算逻辑即可,比如每2小时采样一个点,就用hour_seq = np.arange(len(sugar_kelp_field.N_content_list)) * 2先算出每个点对应的小时数,再除以720得月份。


方案2:按自然月精准映射(适合需要匹配真实日期的场景)

如果需要按照实际月份天数(区分大小月、闰年)展示时间,可以用matplotlib的日期处理模块,将小时值转换为真实时间序列再绘图:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime, timedelta

# 替换为你的模型实际起始运行时间
start_time = datetime(2024, 1, 1)
# 生成每个采样点对应的真实时间
total_points = len(sugar_kelp_field.N_content_list)
time_seq = [start_time + timedelta(hours=i) for i in range(total_points)]

plt.figure()
plt.title('Nitrogen content')
plt.plot(time_seq, sugar_kelp_field.N_content_list)

# 生成原有蓝色散点的时间坐标
point_hour_list = [720, 1440, 2160, 2880, 3600, 4320, 5040, 5760, 6480]
point_value_list = [0.0150, 0.0205, 0.0265, 0.0283, 0.0234, 0.0181, 0.0142, 0.0097, 0.0083]
point_time_list = [start_time + timedelta(hours=h) for h in point_hour_list]
plt.plot(point_time_list, point_value_list, 'bo')

# 配置X轴按自然月显示
ax = plt.gca()
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.xlabel("time")
plt.ylabel("nitrogen content [fraction of dw]")
plt.gcf().autofmt_xdate()  # 自动倾斜日期标签,避免文字重叠

plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:51:23