Скомбинировать линейный график и площадной график в Python

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

У меня есть следующий датафрейм, показывающий определенную меру для двух индексов за каждый день и соответствующую разницу между индексами справа. Для простоты приведены только несколько дней.

eff_date Индекс A Индекс B B минус A
2024-10-01 91 111 20
2024-10-02 88 110 22
2024-10-03 87 109 22
2024-10-04 84 107 23
2024-10-07 82 106 24

Я использовал вышеуказанный датафрейм для создания линейного графика, показывающего ‘B-A’ на вторичной оси y. Вывод с немного другими данными ниже. Возможно ли сделать ‘B-A’ площадным графиком вместо линейного? В основном, я хочу, чтобы площадь под ‘B-A’ была заполнена (и не обязательно показывать линию ‘B-A’, если это возможно).

df = df.rename(columns={"eff_date":"Date"})
plt.figure(figsize = (12,6))
plot = sns.lineplot(x = 'Date', y = 'Index A', data = df, label="Индекс A")
sns.lineplot(x = 'Date', y = 'Index B', data = df, label="Индекс B")
ax2 = plt.twinx()
sns.lineplot(x = 'Date', y = 'B-A', data = df, color="r", ax=ax2)

plt.xticks(rotation=45)

plot.set(xlabel="Дата", ylabel="Мера")

вставьте описание изображения здесь

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

Для создания графика, в котором разница между двумя индексами (‘B – A’) представлена в виде площади, а не линии, вы можете использовать библиотеку Matplotlib вместе с Seaborn. Мы можем использовать метод fill_between из Matplotlib для заполнения области между осью X и линией разницы. Ниже приведен полный код, который иллюстрирует, как это сделать.

Первым делом необходимо импортировать необходимые библиотеки и подготовить данные. Предположим, что у вас уже есть DataFrame, как указано в вопросе.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# Данные
data = {
    "eff_date": ["2024-10-01", "2024-10-02", "2024-10-03", "2024-10-04", "2024-10-07"],
    "Index A": [91, 88, 87, 84, 82],
    "Index B": [111, 110, 109, 107, 106],
    "B minus A": [20, 22, 22, 23, 24]
}
df = pd.DataFrame(data)

# Переименование столбца для удобства
df = df.rename(columns={"eff_date": "Date"})
df['Date'] = pd.to_datetime(df['Date'])  # Преобразуем строки даты в формат datetime

# Параметры графика
plt.figure(figsize=(12, 6))

# Столбчатый (линейный) график для Индекса A
sns.lineplot(x='Date', y='Index A', data=df, label='Index A')

# Столбчатый (линейный) график для Индекса B
sns.lineplot(x='Date', y='Index B', data=df, label='Index B')

# Создание вторичной оси Y
ax2 = plt.twinx()

# Заполнение области между осью X и значениями 'B minus A'
ax2.fill_between(df['Date'], df['B minus A'], color='red', alpha=0.3)

# Установка параметров оси Y для второй оси
ax2.set_ylabel('B minus A', color='red')

# Форматирование графика
plt.xticks(rotation=45)
plt.xlabel('Date')
plt.ylabel('Measure')
plt.title('Сравнение Индексов A и B с заполнением области разницы')

# Показать легенду
plt.legend(loc='upper left')

# Отображение графика
plt.show()

Объяснение кода:

  1. Импорт библиотек: Мы используем pandas для работы с данными, matplotlib.pyplot для построения графиков и seaborn для создания более красивых линий графиков.

  2. Создание DataFrame: Мы создаём DataFrame на основе данных, представленных в вопросе.

  3. Преобразование даты: Мы приводим столбец Date к типу времени datetime, чтобы его легче было использовать для построения графиков.

  4. Построение графиков:

    • Сначала создается линейный график для ‘Index A’ и ‘Index B’.
    • Затем используется plt.twinx() для создания второй оси Y и fill_between для заполнения области под кривой ‘B minus A’.
  5. Форматирование графика: Установлены метки для осей и заголовок графика.

  6. Отображение графика: Наконец, мы используем plt.show(), чтобы визуализировать график.

Таким образом, вы создадите график с линейными представлениями для обоих индексов и залитое цветом пространство под графиком разности ‘B – A’.

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

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