Matplotlib добавляет индикатор сессии (продолжительности) и представляет собой ось y как звезды

Manjesh спросил: 28 марта 2018 в 02:32 в: python

У меня есть простая серия пользовательских событий, где есть логин и выход из системы, и выполняется несколько операций. Я пробовал различные типы графиков и видов, но не повезло.

Я хочу представлять время между логином и выходом из системы в некотором цвете, чтобы оно представляло собой активность. И по оси Y действия должны быть представлены как звезда.

%matplotlib  inlineimport numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
from collections import namedtupleEvent = namedtuple('Event',('event_time', 'event_type'))
# event_type = 1 -> Login,  2 -> watch , 3 -> buy , 4 -> like , 5 -> Logout
user_events = [ Event(event_time=datetime.strptime('2018-04-20 10:00:00', "%Y-%m-%d %H:%M:%S"), event_type=1),
               Event(event_time=datetime.strptime('2018-04-20 12:00:00', "%Y-%m-%d %H:%M:%S"), event_type=2),
               Event(event_time=datetime.strptime('2018-04-20 14:00:00', "%Y-%m-%d %H:%M:%S"), event_type=3),
               Event(event_time=datetime.strptime('2018-04-20 16:00:00', "%Y-%m-%d %H:%M:%S"), event_type=4),
               Event(event_time=datetime.strptime('2018-04-20 19:00:00', "%Y-%m-%d %H:%M:%S"), event_type=5),
               Event(event_time=datetime.strptime('2018-04-21 07:00:00', "%Y-%m-%d %H:%M:%S"), event_type=1),
               Event(event_time=datetime.strptime('2018-04-21 10:00:00', "%Y-%m-%d %H:%M:%S"), event_type=2),
               Event(event_time=datetime.strptime('2018-04-21 14:00:00', "%Y-%m-%d %H:%M:%S"), event_type=5)
              ]df = pd.DataFrame(user_events, columns=['event_time','event_type'])
df = df.set_index('event_time')
df['event_type'].plot()

Я пытаюсь получить что-то в этой строке. Любые рекомендации приветствуются.

Полное рабочее решение, основанное на решении ALollz

1 ответ

Есть решение
ALollz ответил: 28 марта 2018 в 01:58

Я считаю, что для таких сложных вещей всегда нужно прибегать к matplotlib. Вот мой закомментированный код, так что вы можете увидеть, что делает каждая часть.

import pandas as pd
# Used for the legend
import matplotlib.lines as mlines
import matplotlib.patches as mpatches# Set a margin for the time on the plot
tmargin = pd.Timedelta(hours=2)# Set up the figure and the plotting region
_ = plt.figure(figsize=(12,8))
_ = plt.xlabel(df.index.name)
_ = plt.xlim(df.index.min()-tmargin, df.index.max()+tmargin)# Plot the points with scatter, using the colors you can define for each event type
cdict = {1: 'green', 2: 'maroon', 3: 'yellow', 4: 'cyan', 5: 'red'}
ldict = {1: '1 - Login', 2: '2 - Watch', 3: '3 - Buy', 4: '4 - Like', 5: '5 - Logout'}
_ = plt.scatter(df.index, df.event_type, marker='*', zorder=2, s=400, 
        c=[cdict[value] for value in df.event_type.values])
_ = plt.xticks(rotation=30)# make default background red for inactive regions
_ = plt.axvspan(df.index.min()-tmargin, df.index.max()+tmargin, color='r', alpha=0.5)# make the active regions blue
for region in (zip(df[df.event_type==1].index, df[df.event_type==5].index)):
    _ = plt.axvspan(region[0], region[1], color='white', alpha=1, lw=0)
    _ = plt.axvspan(region[0], region[1], color='b', alpha=0.2, lw=0)# Set a margin for the event type
_ = plt.margins(.02)# Create the legend for the points
labels=[]
for item in df.event_type.unique():
    labels.append(mlines.Line2D([], [], color=cdict[item], marker='*',
                          markersize=15, label=ldict[item], lw=0))# Add the session information to the legend
labels.append(mpatches.Patch(color='red', alpha=0.5, label='Inactive Session'))
labels.append(mpatches.Patch(color='blue', alpha=0.2, label='Active Session'))_ = plt.legend(bbox_to_anchor=(1,1), handles=labels, fontsize=20)# Display the plot
_ = plt.show()

Manjesh ответил: 28 марта 2018 в 07:20
работал нормально. Если бы существовало дополнительное поле, называемое продолжительностью события в минутах / секундах (т. Е. Сколько пользователей было на этой странице, прежде чем предпринимать какие-либо действия), что было бы рекомендовано сделать так, чтобы звездочка имела перед ней строку в течение этой продолжительности (например, == ======= X)
ALollz ответил: 28 марта 2018 в 01:54
@Manjesh Смотрите мои изменения. для этого случая