我有一个数据集,其中包含项目的颜色,日期和颜色选择的数量。我把它存储到这样的数据框中:
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)
这个有用,但我想知道如何迭代并执行此操作而不是简单地给出参数。
答案 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
情节如下:
答案 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])