如何使用Python读取CSV文件绘制最高/最低气温与日期对应图表
CSV气温数据绘图问题修正方案
现有代码核心问题梳理
- 创建了
csv.reader对象但未实际使用,循环遍历原始文件对象f只会拿到每行的完整字符串,row[4]取到的是字符串第5位字符,不是CSV第5列的内容 - 未跳过表头行,第一行是字段名,不属于有效气温数据
- 读取到的单元格内容默认是字符串类型,气温数据需要转换为整数才能正常绘图
- 循环中每次覆盖
x、y变量,没有存储所有行的数据,最终绘图仅用到最后一行的无效数据 - 坐标轴映射逻辑错误:日期应为x轴,气温数值应为y轴
修正后完整代码
import csv import matplotlib.pyplot as plt filename = 'death_valley_2018_simple.csv' # 初始化列表存储所有数据 dates = [] max_temps = [] min_temps = [] with open(filename) as f: csv_reader = csv.reader(f, delimiter=',') line_count = 0 for row in csv_reader: # 跳过表头行 if line_count == 0: line_count += 1 continue # 按索引取对应列,做类型转换 dates.append(row[2]) max_temps.append(int(row[4])) min_temps.append(int(row[5])) # 打印行号和对应数据,满足获取行号的需求 print(f"行号:{line_count},日期:{row[2]},最高温:{row[4]},最低温:{row[5]}") line_count += 1 # 绘制分组柱状图 bar_width = 0.35 x = range(len(dates)) # 最高温柱状图 plt.bar([i - bar_width/2 for i in x], max_temps, width=bar_width, label='最高温') # 最低温柱状图 plt.bar([i + bar_width/2 for i in x], min_temps, width=bar_width, label='最低温') # 配置坐标轴 plt.xticks(x, dates, rotation=45) plt.xlabel('日期') plt.ylabel('气温(华氏度)') plt.title('死亡谷2018年1月上旬气温统计') plt.legend() # 自动调整布局防止日期标签被截断 plt.tight_layout() plt.show()
关键逻辑说明
- 用三个空列表存储所有行的对应数据,避免单次循环覆盖变量
- 遍历
csv_reader对象直接获取拆分好的列列表,不需要手动处理CSV分隔符 - 行号变量
line_count从0开始计数,跳过表头后即可对应有效数据的行号 - 分组柱状图通过偏移x轴坐标实现两组柱子并列显示,加图例区分气温类型
- 日期标签旋转45度避免重叠,
tight_layout()方法自动适配布局
内容的提问来源于stack exchange,提问作者Matzi
相关产品推荐
相关产品推荐

