Вопрос или проблема
У меня есть следующий датафрейм, показывающий определенную меру для двух индексов за каждый день и соответствующую разницу между индексами справа. Для простоты приведены только несколько дней.
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()
Объяснение кода:
-
Импорт библиотек: Мы используем
pandas
для работы с данными,matplotlib.pyplot
для построения графиков иseaborn
для создания более красивых линий графиков. -
Создание DataFrame: Мы создаём DataFrame на основе данных, представленных в вопросе.
-
Преобразование даты: Мы приводим столбец
Date
к типу времениdatetime
, чтобы его легче было использовать для построения графиков. -
Построение графиков:
- Сначала создается линейный график для ‘Index A’ и ‘Index B’.
- Затем используется
plt.twinx()
для создания второй оси Y иfill_between
для заполнения области под кривой ‘B minus A’.
-
Форматирование графика: Установлены метки для осей и заголовок графика.
-
Отображение графика: Наконец, мы используем
plt.show()
, чтобы визуализировать график.
Таким образом, вы создадите график с линейными представлениями для обоих индексов и залитое цветом пространство под графиком разности ‘B – A’.