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

