如何在Pandas中创建groupby子图?

时间:2015-10-15 13:58:02

标签: python pandas matplotlib seaborn

我有一个带有犯罪时间序列数据的数据框,其中有一个攻击方面(看起来像下面的格式)。我想对数据框进行分组绘图,以便随着时间的推移探索犯罪趋势。

    Offence                     Rolling year total number of offences       Month
0   Criminal damage and arson   1001                                        2003-03-31
1   Drug offences               66                                         2003-03-31
2   All other theft offences    617                                   2003-03-31
3   Bicycle theft               92                                    2003-03-31
4   Domestic burglary           282                                   2003-03-31

我有一些代码可以完成这项工作,但它有点笨拙而且它丢失了Pandas在单个情节上提供的时间序列格式。 (我已经包含了一张图片来说明)。任何人都可以建议我可以使用这种情节的成语吗?

我会转向Seaborn,但我无法弄清楚如何将xlabel格式化为时间序列。

[![subs = \[\]
for idx, (i, g) in enumerate(df.groupby("Offence")):
        subs.append({"data": g.set_index("Month").resample("QS-APR", how="sum" ).ix\["2010":\],
                     "title":i})

ax = plt.figure(figsize=(25,15))
for i,g in enumerate(subs):
    plt.subplot(5, 5, i)
    plt.plot(g\['data'\])
    plt.title(g\['title'\])
    plt.xlabel("Time")
    plt.ylabel("No. of crimes")
    plt.tight_layout()][1]][1]

2 个答案:

答案 0 :(得分:11)

这是Pandas中6个散点图的可重现的例子,连续6年从pd.groupby()获得。在x轴上 - 年份有油价(布伦特原油),y为同年的sp500值。

import matplotlib.pyplot as plt
import pandas as pd
import Quandl as ql
%matplotlib inline

brent = ql.get('FRED/DCOILBRENTEU')
sp500 = ql.get('YAHOO/INDEX_GSPC')
values = pd.DataFrame({'brent':brent.VALUE, 'sp500':sp500.Close}).dropna()["2009":"2015"]

fig, axes = plt.subplots(2,3, figsize=(15,5))
for (year, group), ax in zip(values.groupby(values.index.year), axes.flatten()):
    group.plot(x='brent', y='sp500', kind='scatter', ax=ax, title=year)

这会产生以下情节:

enter image description here

(以防万一,从这些图中你可以推断,2010年石油与sp500之间存在很强的相关性,而其他年份却没有。)

您可以更改kind中的group.plot(),以使其适合您的特定种类或数据。我的预期,如果你的数据中有pandas,它将保留x轴的日期格式。

答案 1 :(得分:1)

在这种情况下,

Altair可以很好地发挥作用。

import matplotlib.pyplot as plt
import pandas as pd
import quandl as ql

df = ql.get(["NSE/OIL.1", "WIKI/AAPL.1"], start_date="2013-1-1")
df.columns = ['OIL', 'AAPL']
df['year'] = df.index.year

from altair import *

Viz#1-年份没有颜色/年份没有列

Chart(df).mark_point(size=1).encode(x='AAPL',y='OIL').configure_cell(width=200, height=150)

enter image description here

Viz#2-年份/年份没有颜色

Chart(df).mark_point(size=1).encode(x='AAPL',y='OIL', column='year').configure_cell(width=140, height=70).configure_facet_cell(strokeWidth=0)

enter image description here

Viz#3-年份颜色

Chart(df).mark_point(size=1).encode(x='AAPL',y='OIL', color='year:N').configure_cell(width=140, height=70)

enter image description here