[英]How to plot a vertical line on a time series axis?
我想“链接”两段代码。 一,
x= df[df['Value']==True].sort_values(by='Date').head(1).Date
Out[111]:
8 2020-03-04
提取第一个值出现的日期; 另一个
df[df['Buy']==1].groupby('Date').size().plot(ax=ax, label='Buy')
应该通过时间绘制一些信息。
我想在值为 true 的第一个日期添加一条垂直线,即2020-03-04
。 为了做到这一点,我需要将此信息从第一个代码(不使用复制和粘贴)提取到生成绘图的另一段代码。 你能给我一些关于如何做的指南吗? 非常感谢
更新:
我试过如下:
x= df[df['Value']==True].sort_values(by='Date').head(1).Date.tolist()
Out[111]:
8 ['2020-03-04']
df[df['Buy']==1].groupby('Date').size().plot(ax=ax, label='Buy')
ax.axvline(x, color="red", linestyle="--")
但我得到了一个 TypeError: unhashable type: 'numpy.ndarray'
一些数据:
Date Buy Value
0 2020-02-23 0 False
1 2020-02-23 0 False
2 2020-02-25 0 False
3 2020-02-27 1 False
4 2020-03-03 1 False
5 2020-03-03 1 False
6 2020-03-03 0 False
7 2020-03-04 1 False
8 2020-03-04 0 True
9 2020-03-04 0 True
10 2020-03-04 1 False
11 2020-03-05 0 True
12 2020-03-05 1 False
13 2020-03-05 1 False
14 2020-03-05 1 False
15 2020-03-06 0 False
16 2020-03-06 1 False
17 2020-03-06 1 False
18 2020-03-07 1 False
19 2020-03-07 1 False
20 2020-03-07 1 False
21 2020-03-08 1 False
22 2020-03-08 1 False
23 2020-03-09 1 False
24 2020-03-09 1 False
25 2020-03-09 1 False
26 2020-03-10 1 False
27 2020-03-10 1 False
28 2020-03-10 1 False
29 2020-03-10 0 True
30 2020-03-11 1 False
31 2020-03-11 1 False
32 2020-03-13 0 True
33 2020-03-13 0 False
34 2020-03-15 0 True
35 2020-03-16 0 False
36 2020-03-19 0 False
37 2020-03-22 0 True
Date
列采用datetime
格式。import pandas as pd
import random # for test data
import matplotlib.pyplot as plt
# setup sample data
random.seed(365)
rows = 40
data = {'Date': [random.choice(pd.bdate_range('2020-02-23', freq='d', periods=rows).strftime('%Y-%m-%d').tolist()) for _ in range(rows)],
'Buy': [random.choice([0, 1]) for _ in range(rows)],
'Value': [random.choice([False, True]) for _ in range(rows)]}
df = pd.DataFrame(data)
# set the Date column to a datetime
df.Date = pd.to_datetime(df.Date)
# extract values
x = df[df['Value']==True].sort_values(by='Date').head(1).Date
# groupby and plot
ax = df[df['Buy']==1].groupby('Date').size().plot(figsize=(7, 5), label='Buy')
# plot the vertical line; axvline works as long as x is one value
ax.axvline(x, color="red", linestyle="--", label='my value')
# show the legend
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
import matplotlib as mpl
print(mpl.__version__)
print(pd.__version__)
[out]:
3.3.1
1.1.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.