根据熊猫时间序列图中的某些因素更改标记

时间:2014-10-08 19:31:35

标签: python matplotlib pandas

假设我有像这样的pandas DataFrame

df = pd.DataFrame(
    {'data':[1, 2, 3, 4, 5], 'group': [-1, 0, 1, 0, -1]}, 
    index=pd.date_range('2014-01-01', periods=5)
)

我想绘制df.data的时间序列,其中标记根据df.group而变化。有没有一种直接的方法来使用df.plot()执行此操作?如果没有,这是一个简单的方法吗?

2 个答案:

答案 0 :(得分:1)

我的第一个想法是使用seaborn,这是非常好的:

import numpy as np
import pandas
import seaborn
import matplotlib.pyplot as plt
%matplotlib inline

df = pandas.DataFrame({
    'data': [1, 2, 3, 4, 5], 
    'group': [-1, 0, 1, 0, -1]
},  index=pandas.date_range('2014-01-01', periods=5))
df

fgrid = seaborn.FacetGrid(df.reset_index(), hue='group')
fgrid.map(plt.plot, 'index', 'data', linestyle='none', marker='o')

问题在于,我不能通过你的x轴值是日期来实现这一点。

enter image description here

答案 1 :(得分:1)

如果按照Paul H建议的那样修复日期并使用seaborn,那么这里有一种相当粗暴的方法,可以利用groupby和pyplot的颜色循环(尽管你很容易定义你自己的颜色/标记周期。)

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(
    {'data':[1, 2, 3, 4, 5],
     'group': [-1, 0, 1, 0, -1]},
    index=pd.date_range('2014-01-01', periods=5))

fig, ax = plt.subplots()

nc = len(plt.rcParams['axes.color_cycle'])
for i, g in enumerate(df.groupby('group')):
    ax.scatter(g[1].index, g[1]['data'],
               color=plt.rcParams['axes.color_cycle'][i % nc])

fig.autofmt_xdate()
plt.show()

结果情节:

resulting plot