Python读取大文本数据绘制指定图表出错,求排查与修正
Python图表绘制错误排查与修正方案
问题描述
我想用Python重现一张特定样式的图表,数据集为包含time1、power1、time2、power2四列的制表符分隔文本文件(约5000行),但目前生成的图表与预期样式不符,原代码如下:
# Import import numpy as np import pandas as pd import csv import matplotlib.pyplot as plt # Load data from csv file Filename = "powercurveHTC10000_2.txt" with open(Filename) as inp: Dataoverview = list(zip(*(line.strip().split('\t') for line in inp))) print(list(zip(*(line.strip().split('\t') for line in inp))) ) #Data1 = Dataoverview[1] Time1 = Dataoverview[0][0:5000] Power1 = Dataoverview[1][0:5000] Time2 = Dataoverview[3][0:5000] Power2 = Dataoverview[4][0:5000] print('probeer', Dataoverview[3][0:2]) # Plot plt.plot(Time1, Power1, 'ro') # plt.plot(Time2, Power2, 'b*') plt.title('Power usage measured by thermocouples') plt.ylim(0,100) plt.xlim(3000,4250) plt.gca().set_xticks([2]) plt.gca().set_yticks([2]) plt.xlabel('Cycles [s]') plt.ylabel('Power [W]') plt.show()
错误点排查
- 文件读取指针耗尽:打开文件后,第一次
list(zip(*(line.strip().split('\t') for line in inp)))已将文件指针移到末尾,后续print(list(zip(...)))会输出空列表,还可能导致数据读取不完整 - 列索引错误:数据集只有4列,索引应为0-3,但代码中取了
Dataoverview[4],会触发索引越界异常 - 数据类型未转换:读取到的是字符串类型,直接传入
plt.plot会导致绘图逻辑异常,无法正确渲染数值关系 - 坐标轴刻度设置错误:
set_xticks([2])和set_yticks([2])将刻度强制设为仅显示2,和设置的xlim(3000,4250)、ylim(0,100)完全不匹配,导致坐标轴显示混乱 - 冗余数据切片:原文件约5000行,
[0:5000]切片无意义,直接取整列即可
修正后的代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt # 加载数据:用pandas读取制表符分隔文件更简洁,自动处理数据类型 filename = "powercurveHTC10000_2.txt" df = pd.read_csv(filename, sep='\t', header=None, names=['time1', 'power1', 'time2', 'power2']) # 提取所需数据(pandas自动转为数值类型) time1 = df['time1'] power1 = df['power1'] time2 = df['time2'] power2 = df['power2'] # 绘图 plt.figure(figsize=(10,6)) # 可选:设置图表尺寸 plt.plot(time1, power1, 'ro', markersize=2, label='Power 1') # 调整标记大小避免重叠 plt.plot(time2, power2, 'b*', markersize=2, label='Power 2') # 启用第二组数据绘图 plt.title('Power usage measured by thermocouples') plt.ylim(0, 100) plt.xlim(3000, 4250) # 设置与坐标轴范围匹配的合理刻度 plt.gca().set_xticks(np.arange(3000, 4251, 250)) plt.gca().set_yticks(np.arange(0, 101, 20)) plt.xlabel('Cycles [s]') plt.ylabel('Power [W]') plt.legend() # 显示图例区分两组数据 plt.grid(True, alpha=0.3) # 可选:添加网格线提升可读性 plt.show()
修正说明
- 改用
pandas.read_csv读取数据,自动处理制表符分隔、数据类型转换,避免手动读取的各类错误 - 修正列索引逻辑,直接通过列名提取数据,更直观且不易出错
- 调整坐标轴刻度为与
xlim、ylim匹配的合理数值,保证坐标轴显示正常 - 启用第二组数据的绘图,并添加图例、网格线优化图表可读性
- 缩小标记大小,避免数据点过于密集重叠
内容的提问来源于stack exchange,提问作者JetskiS
相关产品推荐
相关产品推荐

