Python绘制Excel多组实验数据图:解决曲线连接与颜色问题
问题与解决方案
问题背景
我有一个包含大量实验数据的Excel文件,每组实验数据均以Time列值为00:00:00开头,各组实验的结束时间不一致。希望将所有实验数据绘制在同一图表中,但现有代码存在两个问题:
- 第一个实验的终点会与第二个实验的起点用线条连接,不符合需求
- 尝试绘制每第5组实验时,各组的颜色没有变化
问题1:实验间线条意外连接的解决
你当前尝试用添加NaN行的方式断开连接,但逻辑存在问题——直接在experiment_data前拼接NaN行,并没有真正实现不同实验绘图数据的分隔。正确的做法是每个实验单独调用一次plt.plot(),因为Matplotlib会为每个plot()调用生成独立的线条对象,不会自动连接不同实验的线条,根本不需要手动添加NaN来断开。
问题2:各组颜色不变化的解决
默认情况下Matplotlib会循环使用有限的默认颜色列表,要实现每组实验(或指定组)的颜色区分,需显式指定颜色映射。取消你注释的colors行,在plot()时指定对应颜色即可。如果仅需绘制每第5组,在循环内增加判断逻辑即可。
修改后的完整代码
import os import pandas as pd import matplotlib.pyplot as plt import numpy as np file_path = os.path.join(source_folder, file_name) df = pd.read_excel(file_path, sheet_name='record') filtered_df = df[df.iloc[:, 3] == 'CC DChg'] selected_columns = ['Time', 'Current(A)', 'Voltage(V)', 'Capacity(Ah)', 'Energy(Wh)'] filtered_selected_df = filtered_df[selected_columns] start_indices = filtered_selected_df[filtered_selected_df['Time'] == '00:00:00'].index plt.figure(figsize=(8, 6)) num_experiments = len(start_indices) colors = plt.cm.viridis(np.linspace(0, 1, num_experiments)) # 启用渐变颜色映射 for i in range(num_experiments): start_idx = start_indices[i] if i + 1 < num_experiments: end_idx = start_indices[i + 1] else: end_idx = len(filtered_selected_df) experiment_data = filtered_selected_df.iloc[start_idx:end_idx] # 如需仅绘制每第5组,取消下方注释并缩进后续代码 # if (i + 1) % 5 != 0: # continue # 直接绘制当前实验数据,无需额外拼接NaN plt.plot(experiment_data['Capacity(Ah)'], experiment_data['Voltage(V)'], marker='o', linestyle='-', color=colors[i], label=f'cycle {i + 1}') plt.title(f'Voltage vs Capacity for {file_name}') plt.xlabel('Capacity(Ah)') plt.ylabel('Voltage(V)') plt.grid(True) plt.legend() # 将图例创建移到循环外,提升效率 plt.show()
关键修改点说明
- 移除了拼接NaN的冗余代码,每个实验独立绘图,自然避免跨实验线条连接
- 启用
viridis渐变颜色映射,为每组实验分配唯一颜色 - 将
plt.legend()移至循环外部,避免重复创建图例,提升性能 - 增加了“仅绘制每第5组”的可选逻辑注释,按需启用
内容的提问来源于stack exchange,提问作者Sajan Kumar
相关产品推荐
相关产品推荐

