在熊猫中通过索引绘图

时间:2016-02-19 13:20:55

标签: python pandas matplotlib

我有一个数据集,其中包含项目的颜色,日期和颜色选择的数量。我把它存储到这样的数据框中:

             date    | picks |        
         ------------+-------|
colour
orange    2016-01-01 |     6 | 
          2016-01-01 |     4 | 
          2016-01-01 |    16 | 
black     2016-01-01 |     0 | 
          2016-01-02 |     7 | 
          2016-01-02 |     0 | 
 green    2016-01-02 |     8 | 
          2016-01-02 |     5 | 
          2016-01-03 |     4 | 
df = pd.DataFrame(
    {'colour': ['orange', 'orange', 'orange', 'black', 'black', 'black', 'green',
                'green', 'green'], 
     'date': ['2016-01-01', '2016-01-01', '2016-01-01', '2016-01-01', '2016-01-02',
              '2016-01-02', '2016-01-02', '2016-01-02', '2016-01-03'], 
     'picks': [6, 4, 16, 0, 7, 0, 8, 5, 4]})
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('colour')

我想为每种颜色绘制子图(选择与日期),即按索引绘制子图。有没有办法做到这一点?

这是我到目前为止所尝试的:

fig, axes=plt.subplot(1,3)
for subp in axes:
    df.plot(ax=sub,subplot=True)

但这显示错误。 我也试过这个:

df.plot(ax=[axes[0,0],axes[0,1],axes[0,2],subplot=True)

这个有用,但我想知道如何迭代并执行此操作而不是简单地给出参数。

2 个答案:

答案 0 :(得分:1)

您可以使用df.groupby(level=0)按索引值拆分数据框。您可以迭代此groupby对象,并在单独的子图上绘制每个组。

例如:

import pandas a pd
import matplotlib.pyplot as plt

# This should reproduce your dataframe. 
# For simplicity, I replaced the dates with an integer to represent the day.
# That should be easy for you to change back.
df = pd.DataFrame([[1,6],[1,4],[1,16],[1,0],[2,7],[2,0],[2,8],[2,5],[3,4]],
                  index=['orange','orange','orange','black','black','black','green','green','green'],
                  columns=['date','picks'])

fig,axes = plt.subplots(1,3)

for a,(i,group) in enumerate(df.groupby(level=0)):
    print group
    gp = group.plot(ax=axes[a],x='date',y='picks')
    gp.set_title(i)

打印哪些:

       date  picks
black     1      0
black     2      7
black     2      0
       date  picks
green     2      8
green     2      5
green     3      4
        date  picks
orange     1      6
orange     1      4
orange     1     16

情节如下:

enter image description here

答案 1 :(得分:0)

更新:刚看到您没有Multiindex系列而是数据帧。在这种情况下,我的答案看起来很像tom's

colors = df.index.unique()
f, axarr = plt.subplots(len(colors))
for idx, color in enumerate(colors):
    df.groupby(df.index).get_group(color).plot(ax=axarr[idx], x='date', y='picks')

以下原始答案。

这会有用吗?

首先我创建一些数据:

iterables = [['orange', 'black', 'green'], [1, 2, 3, 4, 5]]
index = pd.MultiIndex.from_product(iterables, names=['color', 'date'])
s = pd.Series(np.random.randn(15), index=index)

然后我绘制它:

colors = s.index.levels[0].tolist()
f, axarr = plt.subplots(len(colors), sharex=True)
for idx, color in enumerate(colors):
    s[color].plot(ax=axarr[idx])