линейный график с месяцами для x-меток, но с использованием еженедельных данных

#python #pandas #matplotlib

#python #pandas #matplotlib

Вопрос:

Ниже приведен сценарий для упрощенной версии рассматриваемого df:

 import pandas as pd
    
df = pd.DataFrame({ 
                   'week': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],
                   'month' : ['JAN','JAN ','JAN','JAN','FEB','FEB','FEB','FEB','MAR','MAR',
                              'MAR','MAR','APR','APR','APR','APR','APR'],
                   'weekly_stock' : [4,2,5,6,2,3,6,8,7,9,5,3,5,4,5,8,9]
                 })
df

    week    month   weekly_stock
0   1       JAN           4
1   2       JAN           2
2   3       JAN           5
3   4       JAN           6
4   5       FEB           2
5   6       FEB           3
6   7       FEB           6
7   8       FEB           8
8   9       MAR           7
9   10      MAR           9
10  11      MAR           5
11  12      MAR           3
12  13      APR           5
13  14      APR           4
14  15      APR           5
15  16      APR           8
16  17      APR           9
 

В текущем виде приведенный ниже скрипт создает столбчатую диаграмму с week для x-меток

 # plot chart
labels=df.week

line=df['weekly_stock']

fig, ax = plt.subplots(figsize=(20,8))

line1=plt.plot(line, label = '2019')

ax.set_xticks(x)
ax.set_xticklabels(labels, rotation=0)

ax.set_ylabel('Stock')
ax.set_xlabel('week')
plt.title('weekly stock')
 

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

Тем не менее, я хотел бы иметь в month качестве x-метки.

ПРЕДПОЛАГАЕМЫЙ ГРАФИК:

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

Любая помощь будет с благодарностью принята.

Комментарии:

1. попробуйте: labels= [( x,y) for x, y in zip(df['week'], df['month'])]

Ответ №1:

Моя рекомендация — иметь допустимый столбец значений даты и времени вместо 'month' и 'week' , как у вас. Matplotlib довольно умен при работе с допустимыми значениями даты и времени, поэтому сначала я бы структурировал даты следующим образом:

 import pandas as pd
import matplotlib.pyplot as plt

# valid datetime values in a range
dates = pd.date_range(
    start='2019-01-01', 
    end='2019-04-30',
    freq='W',         # weekly increments
    name='dates', 
    closed='left'
    )             

weekly_stocks = [4,2,5,6,2,3,6,8,7,9,5,3,5,4,5,8,9]

df = pd.DataFrame(
    {'weekly_stocks': weekly_stocks},
    index=dates # set dates column as index                   
    )

df.plot(
    figsize=(20,8),
    kind='line', 
    title='Weekly Stocks',
    legend=False,
    xlabel='Week',
    ylabel='Stock'
    )

plt.grid(which='both', linestyle='--', linewidth=0.5)

 

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

Теперь это довольно простое решение. Обратите внимание, что отметки отображаются именно там, где недели; Matplotlib сделал всю работу за нас!

  1. (проще) Вы можете либо заложить «основу данных» перед корректным построением графика, т. Е. отформатировать данные для Matplotlib, чтобы выполнить всю работу, как мы делали выше (представьте, что тики являются фактическими точками даты, созданными в pd.date_range() ).
  2. (сложнее) Используйте локаторы / форматеры тиков, как указано в документах здесь

Надеюсь, это было полезно.

Комментарии:

1. Фантастика! Большое вам спасибо за ваш хорошо объясненный ответ!