使用matplotlib可视化用户使用情况

时间:2017-06-30 21:23:31

标签: python pandas matplotlib

我正在寻找带有一堆记录的python DataFrame,这些记录代表我的用户操作,我想要 在单个图中绘制每个用户在我的应用中花费的时间

DataFrame看起来像:

uid, ts, action
A, 2017-07-01 09:01:10.0000, login
A, 2017-07-01 09:01:20.0000, logout
B, 2017-07-01 09:01:15.0000, login
A, 2017-07-01 09:03:15.0000, login
A, 2017-07-01 09:04:03.0000, logout
B, 2017-07-01 09:05:50.0000, logout

我正在寻找这样的情节:

B |    ************  
A | **      **** 
  +-------------------
    time

1 个答案:

答案 0 :(得分:1)

您需要的不仅仅是pandas才能获得所需的输出。 Pandas是一种数据分析工具,具有有限数量的可视化功能。事实上,它拥有的所有可视化功能都建立在matplotlib之上。既然如此,我建议使用matplotlib工具包中的基本散点图。我已经使用您的起始数据集绘制类似于输出的内容。以下应该是一个不错的起点:

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


d = {'action': ['login', 'logout', 'login', 'login', 'logout', 'logout'],
 'ts': [pd.Timestamp('2017-07-01 09:01:10'),
  pd.Timestamp('2017-07-01 09:01:20'),
  pd.Timestamp('2017-07-01 09:01:15'),
  pd.Timestamp('2017-07-01 09:03:15'),
  pd.Timestamp('2017-07-01 09:04:03'),
  pd.Timestamp('2017-07-01 09:05:50')],
 'uid': ['A', 'A', 'B', 'A', 'A', 'B']}


df = pd.DataFrame(d)
uuids = {k:v for v, k in enumerate(df.uid.unique(), 1)}

df = df.assign(uid_n = df.uid.apply(lambda v: uuids.get(v)))

fig = plt.figure(figsize=(8,5))
ax = fig.add_subplot(111)
xfmt = mdates.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
ax.set_xlabel('time')
ax.set_xticks(df.ts.values)
ax.set_yticks(df.uid_n)
ax.set_yticklabels(df.uid)
ax.plot_date(x = df.ts, y = df.uid_n, marker='*', color='black')
plt.xticks(rotation=90)
plt.tight_layout()
plt.show()

此处使用的主要工具是matplotlib.pyplotmatplotlib.dates模块。第一个模块允许您创建轴,向其添加labelsticks并添加绘图。第二个允许您在x轴上格式化日期值以显示日期值。

这里要提到的一件重要事情是我创建了一个名为uuid_n的整数列,它在创建散点图的过程中使用。这是因为y轴上不接受字符串值。因此,我创建了一个字典,其中每个唯一的字符串值都映射到一个唯一的整数值。完成此操作后,您可以使用uuid列创建tickslabels

上面的代码段应该产生以下结果:

enter image description here

我希望这会有所帮助。