Matplotlib时间轴范围设置求助:Arduino项目数据可视化
解决2万+时间点的Matplotlib可视化问题
我看了你的Arduino数据可视化代码,核心问题是2万多个时间点直接作为字符串x轴标签会导致显示混乱、重叠,而且你尝试的轴范围设置代码没生效。咱们一步步来修复这个问题:
问题分析
- 你把
datetime对象转成了字符串存入days列表,matplotlib处理大量字符串x轴时不仅效率低,还会因为标签过多挤成一团,完全看不清。 - 注释掉的轴设置代码有小语法错误(比如
ax.set_xticks(xtick)少了个s),而且思路可以更简洁高效。 - 代码里的图例标签写错了:你画的是光照数据,但写的是
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
相关产品推荐
相关产品推荐

