使用Python Matplotlib绘图时Y轴刻度不可见且数值不匹配的问题排查
问题分析与解决方案:Matplotlib Y轴刻度异常&数值显示错误
你遇到的两个问题——Y轴刻度不可见、实际值28被显示为0,根源都在数据类型处理和轴配置细节上,咱们拆解来看:
核心问题排查
1. 温度数据是字符串类型,而非数值
你的代码中Temperature.append(column[1])直接将CSV里的温度值以字符串形式存入列表,Matplotlib无法将字符串正确解析为数值进行绘图,导致原本的28被错误识别为非数值数据,最终显示为0。
2. Y轴刻度配置的疏漏
虽然你设置了ax.set_yticks(np.arange(0, 100, 20)),但没有显式指定刻度标签,再加上可能的图表布局问题,导致刻度被边缘截断而不可见;另外,time.strftime(column[0])的用法有误——strftime需要传入时间元组/struct_time对象,直接传字符串会触发错误,应该先解析再格式化。
修正后的完整代码
#-*-coding:utf-8 -*- import csv import time import numpy as np import matplotlib.pyplot as plt Time = [] Temperature = [] # 可选:设置图表尺寸,避免元素拥挤 plt.figure(figsize=(10, 6)) with open('Temperature.csv', 'r') as csvfile: plots = csv.reader(csvfile, delimiter=',') header_row = next(plots) for column in plots: # 解析CSV中的时间字符串(请根据你的实际时间格式调整%Y-%m-%d %H:%M) time_struct = time.strptime(column[0], "%Y-%m-%d %H:%M") # 格式化时间后存入列表,按需调整显示格式 Time.append(time.strftime("%Y-%m-%d %H:%M", time_struct)) # 将温度值转换为float类型,确保Matplotlib能识别为数值 Temperature.append(float(column[1])) ax = plt.gca() ax.set_ylim(0, 100) ax.set_yticks(np.arange(0, 100, 20)) # 显式设置Y轴刻度标签,确保刻度可见 ax.set_yticklabels(np.arange(0, 100, 20)) plt.plot(Time, Temperature, linewidth=5) # 可选:旋转X轴标签,避免文字重叠 plt.xticks(rotation=45) plt.xlabel("Time") plt.ylabel("Temperature") plt.title("Temperature Trend") # 自动调整布局,防止标签、刻度被截断 plt.tight_layout() plt.show()
关键修正说明
- 数据类型转换:将
column[1]转为float,让Matplotlib能正确处理数值数据,解决28显示为0的问题。 - 时间处理修复:用
strptime解析CSV中的时间字符串为时间结构,再用strftime格式化显示,避免时间处理报错。 - 刻度可见性优化:添加
ax.set_yticklabels显式定义Y轴刻度标签,配合plt.tight_layout()自动调整布局,防止刻度被图表边缘遮挡。 - 可读性优化:设置图表尺寸、旋转X轴标签,提升图表的可读性。
内容的提问来源于stack exchange,提问作者Jiayu Sun
相关产品推荐
相关产品推荐

