按星期几将不同的颜色标记添加到Pandas时间序列图中

时间:2018-01-05 17:51:35

标签: python pandas matplotlib timeserieschart

我使用自定义x轴制作了如下的时间序列图:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

df = pd.DataFrame({'points': np.random.randint(1,100, 61)}, 
index=pd.date_range(start='11-1-2017', end='12-31-2017', freq='D'))
df['dow'] = df.index.dayofweek

fig, ax = plt.subplots();
ax.plot_date(df.index, df.points, '-o')
ax.xaxis.set_minor_locator(mdates.WeekdayLocator(byweekday=(0), interval=1))
ax.xaxis.set_minor_formatter(mdates.DateFormatter('%d\n%a'))
ax.xaxis.grid(True, which="minor")
ax.yaxis.grid()
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('\n\n\n%b\n%Y'))

情节看起来像这样:

enter image description here

我真正想要的是每周的每一天(星期一,星期二......)标记颜色不同,所以我修改了上面的代码:

colors = dict(zip(df.dow.unique(), ['orange', 'yellow', 'green', 'blue', 'purple', 'black', 'red']))
ax.plot_date(df.index, df.points, '-o', color=df['dow'].apply(lambda x: colors[x]))

但结果是

  

ValueError:无效的RGBA参数

如果有人有解决方案,请欣赏它!

2 个答案:

答案 0 :(得分:1)

我看到用不同颜色标记绘制线条的唯一方法是将标记绘制为散点图,然后绘制线条。在这种情况下,我会使用标记-绘制日期,然后在顶部绘制散点图,如下所示:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

df = pd.DataFrame({'points': np.random.randint(1,100, 61)}, 
index=pd.date_range(start='11-1-2017', end='12-31-2017', freq='D'))
df['dow'] = df.index.dayofweek
colors = dict(zip(df.dow.unique(), ['orange', 'yellow', 'green', 'blue', 'purple', 'black', 'red']))


fig, ax = plt.subplots();
ax.plot_date(df.index, df.points, '-')
ax.scatter(df.index, df.points, color=df.dow.map(lambda x: colors[x]))
ax.xaxis.set_minor_locator(mdates.WeekdayLocator(byweekday=(0), interval=1))
ax.xaxis.set_minor_formatter(mdates.DateFormatter('%d\n%a'))
ax.xaxis.grid(True, which="minor")
ax.yaxis.grid()
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('\n\n\n%b\n%Y'))

enter image description here

答案 1 :(得分:0)

或者,您可以通过plot仅使用标记创建新的线对象(线条样式为空)并循环显示颜色列表。 plot为线对象应用唯一的颜色,因此需要创建其他线对象或使用scatter,您可以为每个创建的点指定颜色。

fig, ax = plt.subplots()
# create a line plot first
ax.plot_date(df.index, df.points, '-')

# Desired color list
color_list = ['orange', 'yellow', 'green', 'blue', 'purple', 'black', 'red']

# create additional line object by showing only marker of different colors
for idc, d in enumerate(df.dow.unique()):
    this_dow = df.loc[df.dow == d, 'points']
    ax.plot_date(this_dow.index,this_dow, linestyle='', marker ='o', color=color_list[idc])

# axis esthetics
ax.xaxis.set_minor_locator(mdates.WeekdayLocator(byweekday=(0), interval=1))
ax.xaxis.set_minor_formatter(mdates.DateFormatter('%d\n%a'))
ax.xaxis.grid(True, which="minor")
ax.yaxis.grid()
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('\n\n\n%b\n%Y'))

enter image description here