Matplotlib循环中Y轴未切换CSV列问题排查及解决方法
问题分析与解决方案
我来帮你定位问题啦,你的代码里有两个关键问题导致Y轴数据无法切换列:
1. CSV迭代器被耗尽,无法重复遍历
csv.DictReader返回的是一个一次性迭代器,当你第一次执行for lines in csv_reader遍历完所有行后,这个迭代器就走到末尾了,后续再尝试遍历它时不会返回任何数据。这就是为什么只有第一列Y轴能读到数据,后面的列都读不到的原因。
2. Y轴列表未正确重置(且时机不对)
你尝试用y_axe.clear()但没起作用,一方面是因为迭代器已经空了,根本读不到新数据;另一方面,你应该在每次处理新列前就重置Y轴列表,而不是在绘图之后。
修复方案一:一次性读取所有数据到内存(推荐)
把所有CSV数据先转成列表存储,这样可以反复遍历,既高效又简洁:
import csv from matplotlib import pyplot as plt # 一次性读取所有数据,避免迭代器耗尽问题 with open("file.csv", "r") as csv_file: csv_reader = csv.DictReader(csv_file) fieldnames = csv_reader.fieldnames all_data = list(csv_reader) # 把迭代器转成列表,可重复访问 # 提取X轴数据 x_axe = [float(row[fieldnames[0]]) for row in all_data] # 遍历每一列Y轴数据绘图 for i in range(1, len(fieldnames)): # 每次循环重新生成当前列的Y轴列表 y_axe = [float(row[fieldnames[i]]) for row in all_data] plt.plot(x_axe, y_axe, label=fieldnames[i]) plt.legend() plt.show()
修复方案二:每次处理新列时重新读取文件
如果CSV文件特别大,不想一次性加载到内存,可以每次处理新列时重新打开文件创建迭代器:
import csv from matplotlib import pyplot as plt # 先读取X轴数据 x_axe = [] with open("file.csv", "r") as csv_file: csv_reader = csv.DictReader(csv_file) x_axe = [float(row[csv_reader.fieldnames[0]]) for row in csv_reader] # 获取所有列名 fieldnames = [] with open("file.csv", "r") as csv_file: csv_reader = csv.DictReader(csv_file) fieldnames = csv_reader.fieldnames # 遍历每一列Y轴,每次重新读取文件 for i in range(1, len(fieldnames)): y_axe = [] with open("file.csv", "r") as csv_file: csv_reader = csv.DictReader(csv_file) for row in csv_reader: y_axe.append(float(row[fieldnames[i]])) plt.plot(x_axe, y_axe, label=fieldnames[i]) plt.legend() plt.show()
简单来说,核心问题就是你没意识到csv.DictReader的迭代器只能用一次,上面两种方案分别从"预加载数据"和"重复创建迭代器"两个角度解决了这个问题,同时也正确处理了Y轴数据的重置,这样就能正常绘制多组Y轴曲线啦~
内容的提问来源于stack exchange,提问作者user841330
相关产品推荐
相关产品推荐

