Excel – построение графиков с помощью Python

Вопрос или проблема

У меня есть файл Excel с большим объемом экспериментальных данных, каждое экспериментальное значение начинается со значения времени 00:00:00, время окончания не одно и то же для всех. Я хочу отобразить все экспериментальные данные на одном графике.

В настоящее время я написал скрипт на Python, он хорошо строит графики, но я сталкиваюсь с одной проблемой: конечная точка первого эксперимента соединена линией с первой точкой второго эксперимента, чего я не хочу.

Также, когда я пытался построить график для каждого пятого эксперимента, цвет не менялся для каждого эксперимента.

Я пытался использовать следующий код, но он не решает проблему.

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(0, 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]
            
            if i != 0:
                experiment_data = pd.concat([pd.DataFrame({'Capacity(Ah)': [float('nan')], 'Voltage(V)': [float('nan')]}),
                                             experiment_data])
            
            plt.plot(experiment_data['Capacity(Ah)'], experiment_data['Voltage(V)'],marker="o", linestyle="-", 
                     label=f'цикл {i + 1}')
            plt.legend()
            
        plt.title(f'Напряжение против ёмкости для {file_name}')
        plt.xlabel('Ёмкость(Ah)')
        plt.ylabel('Напряжение(V)')
        plt.grid(True)
        plt.show()

Вместо объединения с NaN, вы можете использовать значения NaN напрямую в данных временного ряда при вызове plt.plot(). Это автоматически заставит линию разрываться между экспериментами.

Вы можете использовать plt.cm или явно указать цвет, перебирая список цветов или используя цветовую карту. Вы можете отредактировать свой код следующим образом:

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]

# Получение индексов начала каждого эксперимента (где время '00:00:00')
start_indices = filtered_selected_df[filtered_selected_df['Time'] == '00:00:00'].index

# Инициализация графика
plt.figure(figsize=(10, 7))

# Количество экспериментов и цвета
num_experiments = len(start_indices)
colors = plt.cm.viridis(np.linspace(0, 1, num_experiments))

# Цикл по каждому эксперименту
for i in range(0, num_experiments, 5):  # Строить график для каждого пятого эксперимента
    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]

    # Построение графика с различными цветами, маркером и стилем линии
    plt.plot(experiment_data['Capacity(Ah)'], experiment_data['Voltage(V)'],
             marker="o", linestyle="-", color=colors[i % len(colors)],
             label=f'Цикл {i + 1}')
    
# Добавление меток, заголовка и легенды
plt.title(f'Напряжение против ёмкости для {file_name}')
plt.xlabel('Ёмкость(Ah)')
plt.ylabel('Напряжение(V)')
plt.grid(True)
plt.legend()
plt.show()

Ответ или решение

Чтобы решить вашу задачу по визуализации экспериментальных данных в Excel с использованием Python и устранить соединение линиями между экспериментами, можно внести несколько изменений в ваш код.

Вместо добавления NaN значений для разрыва линий, мы можем просто использовать NaN в данных временного ряда. Это автоматически позволит разрывать линии между экспериментами. Кроме того, для изменения цвета каждой линии вы можете использовать plt.cm или просто определить список цветов. Ниже представлен обновленный код с исправлениями:

import os
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# Путь к файлу
file_path = os.path.join(source_folder, file_name)
# Чтение данных из Excel
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=(10, 7))

# Количество экспериментов и цветовая палитра
num_experiments = len(start_indices)
colors = plt.cm.viridis(np.linspace(0, 1, num_experiments))

# Цикл по каждому эксперименту (каждый 5-й эксперимент)
for i in range(0, num_experiments, 5):  
    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]

    # Добавление NaN для разрыва линий между экспериментами
    if i != 0:
        experiment_data = pd.concat([pd.DataFrame({'Capacity(Ah)': [float('nan')], 'Voltage(V)': [float('nan')]}),
                                     experiment_data])

    # Построение графика с разными цветами, маркерами и линиями
    plt.plot(experiment_data['Capacity(Ah)'], experiment_data['Voltage(V)'],
             marker='o', linestyle='-', color=colors[i % len(colors)],
             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()

Объяснение изменений:

  1. Разрывы между экспериментами: Добавлено использование NaN непосредственно в графике, что позволяет автоматически разрывать линию между экспериментами. Если текущий эксперимент не первый, добавляется пустая строка с NaN перед добавлением данных текущего эксперимента.

  2. Цветовая схема: Использован массив цветов с помощью plt.cm.viridis, чтобы обеспечить разнообразие цветов для каждого эксперимента. Благодаря использованию индекса i % len(colors) можно уверенно менять цвет для каждой 5-й линии.

Эти изменения должны помочь вам получить желаемую визуализацию, избегая соединения линий между экспериментами и обеспечивая изменение цвета для графиков.

Оцените материал
Добавить комментарий

Капча загружается...