web-dev-qa-db-fra.com

Tracé linéaire avec des points de données dans pandas

En utilisant pandas je peux facilement faire un tracé linéaire:

import pandas as pd
import numpy as np
%matplotlib inline # to use it in jupyter notebooks

df = pd.DataFrame(np.random.randn(50, 4), 
        index=pd.date_range('1/1/2000', periods=50), columns=list('ABCD'))
df = df.cumsum()
df.plot();

enter image description here

Mais je ne sais pas comment tracer également les données sous forme de points sur les lignes, comme dans cet exemple:

enter image description here

Cet exemple matplotlib semble suggérer la direction, mais je ne trouve pas comment le faire en utilisant pandas capacités de traçage. Et je suis particulièrement intéressé à apprendre à faire avec pandas parce que je travaille toujours avec des cadres de données.

Des indices?

17
lincolnfrias

Vous pouvez utiliser le style kwarg pour le df.plot commande. De la docs :

style: liste ou dict

style de ligne matplotlib par colonne

Vous pouvez donc définir un style de ligne pour toutes les lignes ou un style différent pour chaque ligne.

par exemple. cela fait quelque chose de similaire à ce que vous avez demandé:

df.plot(style='.-')

enter image description here

Pour définir un marqueur et un style de ligne différents pour chaque ligne, vous pouvez utiliser une liste:

df.plot(style=['+-','o-','.--','s:'])

enter image description here

Vous pouvez également transmettre le markevery kwarg à la commande de tracé de matplotlib pour ne dessiner que des marqueurs à un intervalle donné.

df.plot(style='.-', markevery=5)

enter image description here

38
tmdavison

Vous pouvez utiliser l'argument markevery dans df.plot(), comme suit:

df = pd.DataFrame(np.random.randn(1000, 4), index=pd.date_range('1/1/2000', periods=1000), columns=list('ABCD'))
df = df.cumsum()

df.plot(linestyle='-', markevery=100, marker='o', markerfacecolor='black')

plt.show()

enter image description here

markevery accepterait une liste de points spécifiques (ou de dates), si c'est ce que vous voulez.

Vous pouvez également définir une fonction pour vous aider à trouver le bon emplacement:

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

df = pd.DataFrame(np.random.randn(1000, 4), index=pd.date_range('1/1/2000', periods=1000), columns=list('ABCD'))
df = df.cumsum()

dates = ["2001-01-01","2002-01-01","2001-06-01","2001-11-11","2001-09-01"]
def find_loc(df, dates):
    marks = []
    for date in dates:
        marks.append(df.index.get_loc(date))
    return marks


df.plot(linestyle='-', markevery=find_loc(df, dates), marker='o', markerfacecolor='black')

plt.show()

enter image description here

6
Vinícius Aguiar