Python绘图中Y轴数值未按顺序排列的原因排查
Y轴未按数字顺序排列的原因及修复方案
问题根源
你的代码存在两个核心问题,导致Matplotlib无法将Y轴识别为连续数值轴:
- try-except块范围过大:整个数据处理逻辑被包裹在一个try块中,只要某一行的温度转换出错(比如锡特卡数据中存在空的温度值),就会直接跳过后续所有转换操作,导致
TMAX/TMIN列表混合了字符串和整数类型。 - 未过滤无效数据:直接将CSV中所有行存入字典,没有跳过温度值为空的行,列表中残留无法转换为整数的无效值。
当Matplotlib遇到混合类型数据时,会默认将Y轴当作分类轴处理,因此不会按数字大小排序。
修复后的代码
重构数据处理逻辑,逐行过滤无效数据并缩小异常捕获范围,确保温度列表仅包含有效整数:
import matplotlib.pyplot as plt import matplotlib.dates as mdates from datetime import datetime import csv def get_weather_data(path): """从CSV文件提取有效日期与高低温数据""" data = {"DATE": [], "TMAX": [], "TMIN": []} with open(path, 'r') as csv_file: csv_reader = csv.reader(csv_file) headers = next(csv_reader) # 获取目标列的索引 date_idx = headers.index("DATE") tmax_idx = headers.index("TMAX") tmin_idx = headers.index("TMIN") for row in csv_reader: # 跳过空值或无效数据行 if not row[date_idx] or not row[tmax_idx] or not row[tmin_idx]: continue try: date = datetime.strptime(row[date_idx], "%Y-%m-%d") tmax = int(row[tmax_idx]) tmin = int(row[tmin_idx]) except (ValueError, TypeError): continue # 跳过格式错误的行 data["DATE"].append(date) data["TMAX"].append(tmax) data["TMIN"].append(tmin) return data # 文件路径 path_valley = 'weather_data/death_valley_2021_full.csv' path_sitka = 'weather_data/sitka_weather_2021_full.csv' # 获取有效数据 death_valley_data = get_weather_data(path_valley) sitka_data = get_weather_data(path_sitka) # 绘图 plt.style.use('seaborn') fig, ax = plt.subplots() # 绘制死亡谷温度曲线 ax.plot(death_valley_data['DATE'], death_valley_data['TMAX'], color='r', label='死亡谷 - 高温') ax.plot(death_valley_data['DATE'], death_valley_data['TMIN'], color='b', label='死亡谷 - 低温') # 绘制锡特卡温度曲线 ax.plot(sitka_data['DATE'], sitka_data['TMAX'], color='m', label='锡特卡 - 高温') ax.plot(sitka_data['DATE'], sitka_data['TMIN'], color='c', label='锡特卡 - 低温') # 配置图表格式 title = '2021年每日高低温对比\n阿拉斯加州锡特卡 vs 加利福尼亚州死亡谷' ax.set_title(title, fontsize=16) # X轴配置 ax.set_xlabel('', fontsize=16) ax.xaxis.set_major_locator(mdates.MonthLocator()) ax.xaxis.set_major_formatter(mdates.DateFormatter('%B')) fig.autofmt_xdate() # Y轴配置 ax.set_ylabel('温度(°F)', fontsize=16) ax.tick_params(labelsize=14) plt.legend() plt.show()
关键修复点说明
- 逐行数据校验:在读取每一行时直接检查温度值是否为空,提前过滤无效数据
- 精准异常捕获:仅捕获单条数据的转换错误,不会中断整个数据处理流程
- 类型一致性保证:最终返回的
TMAX/TMIN列表仅包含整数,确保Matplotlib将Y轴识别为连续数值轴,自动按数字顺序排列
内容的提问来源于stack exchange,提问作者bsvprog
相关产品推荐
相关产品推荐

