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

Python绘图中Y轴数值未按顺序排列的原因排查

Y轴未按数字顺序排列的原因及修复方案

问题根源

你的代码存在两个核心问题,导致Matplotlib无法将Y轴识别为连续数值轴:

  1. try-except块范围过大:整个数据处理逻辑被包裹在一个try块中,只要某一行的温度转换出错(比如锡特卡数据中存在空的温度值),就会直接跳过后续所有转换操作,导致TMAX/TMIN列表混合了字符串和整数类型。
  2. 未过滤无效数据:直接将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:40:06