将熊猫 groupby 中的组绘制在一个图中时如何更改 x 轴

Posted

技术标签:

【中文标题】将熊猫 groupby 中的组绘制在一个图中时如何更改 x 轴【英文标题】:How to change the x-axis when plotting groups from a pandas groupby combined in one plot 【发布时间】:2013-05-18 19:42:40 【问题描述】:

我正在处理一个聊天日志,我的数据包含时间戳、用户名和消息。我的目标是绘制多个用户每月的消息数量,以便比较用户何时活跃。

问题在于 x 轴。在那里,我想根据频率(在这种情况下是几个月)来确定日期。相反,似乎在那里输出了分组数据的 Multiindex。此外,数据似乎分组正确,但图中每个月都有三个数据点。

我包含了一些代码来生成随机数据。 (我使用的是 Python 3.2)

这里是当前输出:

import numpy as np
import time
import datetime
import pandas as pd
import matplotlib.pyplot as plt
from pandas.util.testing import rands

a=datetime.datetime(2012,12,3)
b=datetime.datetime(2013,12,3)
a_tstamp=time.mktime(a.timetuple())
b_tstamp=time.mktime(b.timetuple())

message_number=400
tstamps=np.random.random_integers(a_tstamp,b_tstamp,message_number)
tstamps.sort()

dates=[datetime.datetime.fromtimestamp(x) for x in tstamps]

usernames=[rands(4) for x in range(10)]
usernames=usernames*40
values=np.random.random_integers(0,45,message_number)

df=pd.DataFrame('tstamps':dates,'usernames':usernames,'messages':[rands(5) for x in range(message_number)])
df=df.set_index(df.tstamps)


grouped=df.groupby(df.usernames)


# trying to plot a trend to see how active user were over several months
plt.figure()
for k,g in grouped:
    g=g.resample('m',how='count')
    g.plot(style='*-',label=k )

    plt.show()
plt.legend(loc='best')
plt.show()

【问题讨论】:

【参考方案1】:

问题:您的结果是按日期和按列(消息、用户名、时间戳)索引的。

2013-07-31  messages     3
            tstamps      3
            usernames    3
2013-08-31  messages     4
            tstamps      4
            usernames    4

不要对整个组重新采样,而是只取消息列,然后重新采样,

plt.figure()
for k, g in grouped:
    messages = g.messages.resample('m', how='count')
    messages.plot(style='*-', label=k)
plt.show()

现在正在绘制的系列是

2012-12-31    3
2013-01-31    3
2013-02-28    3
2013-03-31    4
...

输出看起来像

【讨论】:

以上是关于将熊猫 groupby 中的组绘制在一个图中时如何更改 x 轴的主要内容,如果未能解决你的问题,请参考以下文章

如何在复杂的熊猫 groupby 中绘制图形?

如何在图表中绘制熊猫 groupby 值

在 seaborn 中绘制不同的组时如何将数据作为一组包含在内

Seaborn通过多个groupby绘制熊猫数据框

在熊猫图中显示第一个和最后一个标签

在熊猫折线图中绘制多列[重复]