添加到pandas图的行

时间:2016-05-10 16:31:58

标签: python pandas

使用pandas我创建了一个时间序列图,如下所示:

import numpy as np
import pandas as pd

rng = pd.date_range('2016-01-01', periods=60, freq='D')
ts = pd.Series(np.random.randn(len(rng)), index=rng)

ax = ts.plot()
ax.axhline(y=ts.mean(), xmin=-1, xmax=1, color='r', linestyle='--', lw=2)

enter image description here

我想仅使用二月份的数据在平均水平添加另一条水平线。平均值只是ts.loc['2016-02'],但是如何在该级别添加一条不会覆盖整个数字的水平线,但仅限于2月份的日期?

2 个答案:

答案 0 :(得分:3)

或者您可以创建一个新的时间序列,其值为平均值,索引仅跨越二月。

ts_feb_mean = ts['2016-02'] * 0 + ts['2016-02'].mean()

一起看起来像是:

import numpy as np
import pandas as pd

rng = pd.date_range('2016-01-01', periods=60, freq='D')
ts = pd.Series(np.random.randn(len(rng)), index=rng)

# Feb mean
ts_fm = ts['2016-02'] * 0 + ts['2016-02'].mean()
ts_fm = ts_fm.reindex_like(ts)

# Total mean
ts_mn = ts * 0 + ts.mean()

# better control over ax
fig, ax = plt.subplots(1, 1)
ts.plot(ax=ax)
ts_mn.plot(ax=ax)
ts_fm.plot(ax=ax)

答案 1 :(得分:1)

您可以使用xminxmax来控制图表中行的开始和结束位置。但这只占图表的百分比。

import numpy as np
import pandas as pd

np.random.seed([3, 1415])
rng = pd.date_range('2016-01-01', periods=60, freq='D')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
ts_feb = ts['2016-02']

# used to figure out where to start and stop
ts_len = float(len(ts))
ts_len_feb = float(len(ts_feb))
ratio = ts_len_feb / ts_len

ax = ts.plot()
ax.axhline(y=ts.mean() * 5, xmin=0, xmax=1, color='r', linestyle='--', lw=2)
ax.axhline(y=ts_feb.mean() * 5, xmin=(1. - ratio), xmax=1, color='g', linestyle=':', lw=2)