Построение вертикальной линии для df.plot.bar работает, но не для линейного графика - PullRequest
1 голос
/ 08 мая 2020

Я выполнил весь шаг после моего вопроса здесь: Pandas Dataframe: как добавить вертикальную линию с меткой к столбчатой ​​диаграмме, когда ваши данные являются временными рядами?

it должен был решить мою проблему, но когда я изменил тип графика на линию, вертикальная линия не появилась. Я копирую тот же код и меняю тип графика на строку вместо полосы:

как вы можете видеть с полосой, появляется вертикальная линия (красная).

# function to plot a bar 
def dessine_line3(madataframe,debut_date , mes_colonnes):

madataframe.index = pd.to_datetime(madataframe.index,format='%m/%d/%y')
df = madataframe.loc[debut_date:,mes_colonnes].copy()
filt = (df[df.index == '4/20/20']).index
df.index.searchsorted(value=filt)
fig,ax = plt.subplots()
df.plot.bar(figsize=(17,8),grid=True,ax=ax)
ax.axvline(df.index.searchsorted(filt), color="red", linestyle="--", lw=2, label="lancement")
plt.tight_layout()

out: enter image description here

но я просто меняю код, изменяя тип графика на линию: нет вертикальной линии, а также изменилась ось x (дата). enter image description here

поэтому я написал другой код juste, чтобы нарисовать линию с вертикальной линией

ax = madagascar_maurice_case_df[["Madagascar Covid-19 Ratio","Maurice Covid-19 Ratio"]].loc['3/17/20':].plot.line(figsize=(17,7),grid=True)

filter = (df [df.index == '4/20 /20'−).index ax.axvline (df.index.searchsorted (filter), color = "red", linestyle = "-", lw = 2, label = "lancement") plt.show ()

, но результат тот же

после комментария ниже, вот мой последний код:

def dessine_line5(madataframe,debut_date , mes_colonnes):
    plt.figure(figsize=(17,8))
    plt.grid(b=True,which='major',axis='y')
    df = madataframe.loc[debut_date:,mes_colonnes]
    sns.lineplot(data=df)
    lt = datetime.toordinal(pd.to_datetime('4/20/20'))
    plt.axvline(lt,color="red",linestyle="--",lw=2,label="lancement")
    plt.show()

и результат: enter image description here

1 Ответ

1 голос
/ 09 мая 2020

Отметка графика locs

  • Проблема в том, что расположение отметок графика зависит от типа графика и api
    • df.plot vs. plt.plot vs. sns.lineplot
  • Поместите ticks, labels = plt.xticks() после df.plot.bar(figsize=(17,8),grid=True,ax=ax), и печать ticks даст array([0, 1, 2,..., len(df.index)]), поэтому df.index.searchsorted(filt) работает, он дает целочисленное местоположение.
  • df.plot() имеет метки типа array([13136, 13152, 13174, 13175], dtype=int64) для моего диапазона дат выборки. На самом деле я не знаю, как получаются эти числа, поэтому я не знаю, как преобразовать дату в этот формат.
  • sns.lineplot и plt.plot имеют точки деления, которые являются порядковым представлением datetime, array([737553., 737560., 737567., 737577., 737584., 737591., 737598., 737607.]

Для lineplot с вашим примером:

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

sns.lineplot(data=df)
lt = datetime.toordinal(pd.to_datetime('2020/04/20'))
plt.axvline(lt, color="red", linestyle="--", lw=2, label="lancement")
plt.show()

Для данных моего примера:

import numpy as np

data = {'a': [np.random.randint(10) for _ in range(40)],
        'b': [np.random.randint(10) for _ in range(40)],
        'date': pd.bdate_range(datetime.today(), periods=40).tolist()}

df = pd.DataFrame(data)
df.set_index('date', inplace=True)

sns.lineplot(data=df)
ticks, labels = plt.xticks()
lt = datetime.toordinal(pd.to_datetime('2020-05-19'))
plt.axvline(lt, color="red", linestyle="--", lw=2, label="lancement")
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...