Генерация линейного графика с использованием Seaborn или Matplotlib с: годом в качестве оттенка, месяцем в качестве оси X и столбцом с плавающей запятой в качестве оси Y

#python #pandas #dataframe #matplotlib #seaborn

#python #pandas #фрейм данных #matplotlib #seaborn

Вопрос:

Проблема в том, что я пытаюсь сгенерировать линейный график с помощью функции seaborn.lineplot(), но, похоже, я не могу найти способ сгенерировать линейный график, подобный приведенному ниже:

https://i.stack.imgur.com/zUKog.png

В моем наборе данных есть следующие столбцы: год, месяц, день, единицы измерения, цена за единицу, продажи. Я использовал функцию groupby от pandas для суммирования продаж за каждый год в каждом месяце.

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

years_list = [date.strftime('%Y/%#-m/%#-d') for date in pd.date_range('01/01/2000', '31/12/2019')]

data = {
    'year': [int(date.split('/')[0]) for date in years_list],
    'month': [int(date.split('/')[1]) for date in years_list],
    'day': [int(date.split('/')[2]) for date in years_list],
    'units': [np.random.randint(1,25) for turns in range(len(years_list))],
    'price_per_unit': [np.random.uniform(10, 100) for turns in range(len(years_list))]
}

df = pd.DataFrame(data)
df['sales'] = df['price_per_unit'] * df['units']
each_month = df.groupby(['year', 'month'])['sales'].sum().reset_index()
 

Изначально я думал, что использование кода sns.lineplot(x='month', y='sales', hue='year', data=each_month) автоматически сгенерирует желаемый график, но вместо этого он сгенерировал запутанный график.

У кого-нибудь есть решение для меня? даже если это не с помощью seaborn, а matplotlib.

Ответ №1:

Да, эта строка действительно создает то, что вы хотите. Однако для числового оттенка sns автоматически окрашивает вашу линию в соответствии с непрерывной цветовой картой. Чтобы преодолеть это, вы можете преобразовать свой year тип в string:

 each_month['year'] = 'Y'   each_month['year'].astype(str)
plt.figure(figsize=(10,6))
sns.lineplot(x='month', y='sales', hue='year', data=each_month)
 

Вывод:

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

Ответ №2:

Задайте month как индекс, а затем groupby year , затем просто постройте график sales .

 each_month.set_index('month').groupby('year').sales.plot(legend=True, figsize=(10, 6))
 

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