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

Matplotlib时间轴范围设置求助:Arduino项目数据可视化

解决2万+时间点的Matplotlib可视化问题

我看了你的Arduino数据可视化代码,核心问题是2万多个时间点直接作为字符串x轴标签会导致显示混乱、重叠,而且你尝试的轴范围设置代码没生效。咱们一步步来修复这个问题:

问题分析

  1. 你把datetime对象转成了字符串存入days列表,matplotlib处理大量字符串x轴时不仅效率低,还会因为标签过多挤成一团,完全看不清。
  2. 注释掉的轴设置代码有小语法错误(比如ax.set_xticks(xtick)少了个s),而且思路可以更简洁高效。
  3. 代码里的图例标签写错了:你画的是光照数据,但写的是temprature,这点也顺手改了。

修复后的代码

import csv
import matplotlib.pyplot as plt
from datetime import datetime

header = []
data = []
path="DATALOG.csv" # 替换成你的文件名
file = open(path, newline='')
reader=csv.reader(file)
header=next(reader) # 读取表头
data=[row for row in reader] # 读取所有数据行
file.close()

# 可选:打印表头和索引,方便确认列对应关系
def print_header():
    for index, column_header in enumerate(header):
        print(index, column_header)

# 准备数据:直接用datetime对象作为x轴,不用转字符串
timestamps = []
light_levels = []
for row in data:
    # 解析时间字符串为datetime对象(注意格式要和你的CSV里的完全匹配)
    current_time = datetime.strptime(row[0], "%A %H:%M:%S %d/%m/%Y")
    timestamps.append(current_time)
    # 读取光照数据转成浮点数
    light_levels.append(float(row[3]))

# 创建画布
fig, ax = plt.subplots(dpi=128, figsize=(20, 6)) # 调整画布宽度,不用50这么大,20足够
ax.plot(timestamps, light_levels, c='red', label='Light Level (%)')

# 设置图表标题和轴标签
ax.set_title("Light Level Over Time", fontsize=16)
ax.set_xlabel('Time', fontsize=12)
ax.set_ylabel('Light (%)', fontsize=12)

# 关键:设置x轴刻度间隔,避免标签重叠
# 这里用matplotlib的dates模块来自动设置合理的时间刻度
import matplotlib.dates as mdates
# 比如设置为每隔1小时显示一个标签(根据你的数据密度调整,比如如果是每分钟一条,就用HourLocator)
ax.xaxis.set_major_locator(mdates.HourLocator(interval=1))
# 设置时间标签的显示格式
ax.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M %d/%m"))

# 如果需要设置特定的x轴范围(比如只显示某段时间),取消下面两行注释并修改时间
# start_time = datetime(2020, 1, 8, 12, 0, 0)
# end_time = datetime(2020, 1, 9, 11, 58, 10)
# ax.set_xlim(start_time, end_time)

# 旋转x轴标签,避免重叠
plt.xticks(rotation=45, ha='right')
ax.tick_params(axis='both', which='major', labelsize=10)
ax.legend()

# 先show再savefig的话,savefig会保存空白图,所以先保存再显示
plt.savefig('plot.png', bbox_inches='tight') # bbox_inches='tight'防止标签被裁剪
plt.show()

关键优化点说明

  • 用datetime对象作为x轴:matplotlib对时间序列的支持更好,能自动处理刻度和范围,比字符串高效得多。
  • 用matplotlib.dates模块设置刻度:HourLocator/DayLocator可以根据你的数据密度自动或手动设置刻度间隔,不用自己计算索引。
  • 调整画布大小和标签旋转:把画布宽度从50改成20足够,旋转标签并设置ha='right'让标签更整齐。
  • 修复保存顺序:先savefig再show,否则show()会清空画布,保存的是空白图。

如果你的时间格式和代码里的"%A %H:%M:%S %d/%m/%Y"不匹配,或者需要调整刻度间隔(比如改成每天显示一个标签),随时告诉我你的数据细节就行!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:47:36