多文件TIME-X曲线同图绘制遇阻:字典方案失效,求简洁实现
问题分析与解决方案
原代码的核心问题
- 循环逻辑混乱:遍历文件名后,
data变量仅保留最后一个文件的数据,后续遍历时间列、数值列时,全部基于最后一个文件处理,导致数据不匹配且丢失前序文件的信息。 - 绘图数据格式错误:
my_dict["Time"]和my_dict["Value"]是Series对象的列表,直接传入plt.plot()无法被matplotlib正确解析,自然无法生成曲线。 - 图例逻辑冗余:
if Legend_Title == Legend_Title等价于判断参数不为None,写法冗余,且未给每条曲线指定图例标签。
修正后的简洁实现方案
以下代码支持任意数量文件,按指定列生成同图多曲线,逻辑清晰且避免数据丢失:
import pandas as pd import matplotlib.pyplot as plt def func(x): s1 = x % 100 s2 = (x // 100) % 100 s3 = x // 10000 return s3 * 3600 + s2 * 60 + s1 def plot_multi_curves(file_names, time_headers, value_headers, x_label=None, y_label=None, title=None, legend_title=None): # 确保输入列表长度匹配 if len(file_names) != len(time_headers) or len(file_names) != len(value_headers): raise ValueError("文件名列表、时间列头列表、数值列头列表长度必须一致") plt.figure(figsize=(10, 6)) # 可选:设置图大小 for fname, time_col, val_col in zip(file_names, time_headers, value_headers): # 读取文件(sep="\s+"处理任意数量空格分隔,适配多数空格分隔的文本文件) data = pd.read_csv(fname, sep="\s+") # 转换时间格式 time_data = data[time_col].map(func) # 获取数值数据 val_data = data[val_col] # 绘制单条曲线,用文件名作为图例标签 plt.plot(time_data, val_data, label=fname) # 设置图表属性 if x_label: plt.xlabel(x_label) if y_label: plt.ylabel(y_label) if title: plt.title(title) # 添加图例,自动调整布局避免截断 plt.legend(title=legend_title if legend_title else None, loc="upper right", bbox_to_anchor=(1.05, 1)) plt.tight_layout() plt.show() # 调用示例 plot_multi_curves( file_names=["PINA 50.199 263.960 20011121 GEODETIC nT17280", "ISLL 53.856 265.340 20011121 GEODETIC nT17280"], time_headers=["TIME", "TIME"], value_headers=["X", "X"], x_label="时间(秒)", y_label="X值", title="多文件曲线对比", legend_title="数据源文件" )
关键优化点
- 同步遍历输入:用
zip()同时遍历文件名、时间列头、数值列头,确保每个文件对应正确的列,避免数据错位。 - 逐文件即时绘图:读取一个文件就绘制对应曲线,无需额外字典存储,逻辑更简洁,内存占用更低。
- 输入合法性校验:提前检查输入列表长度匹配性,快速定位参数错误。
- 图表可读性优化:用
plt.tight_layout()自动调整布局,避免图例被截断;用文件名作为曲线标签,直观区分数据源。
内容的提问来源于stack exchange,提问作者Passion4Cats22
相关产品推荐
相关产品推荐

