Python(matplotlib.pyplot)按日期向xaxis添加垂直线

2024-06-01 21:27:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在搜索,我找到了一些方法来实现它,但我似乎无法在我的代码中实现它。如果我能参考上述国家的全国封锁状态,那就太好了。否则,硬编码日期也可以。 像这样的 enter image description here

请让我知道我的问题是否缺乏任何明确的指针!如果可以的话,我很乐意提供给他们

文件的下载链接:sg_df

https://query1.finance.yahoo.com/v7/finance/download/%5ESTI?P=^STI?period1=1442102400&period2=1599955200&interval=1mo&events=history

链接到我一直引用的内容

How do you plot a vertical line on a time series plot in Pandas?

matplotlib plot_date() add vertical line at specified date

到目前为止,这就是我一直在做的

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime, date

#formating date and setting date as index
sg_df = pd.read_csv("^STI.csv")
conv = lambda x: datetime.strptime(x, "%d/%m/%Y")
sg_df["Date"] = sg_df["Date"].apply(conv)
sg_df.sort_values("Date", inplace = True)
sg_df.set_index("Date", inplace = True)

# country lockdown status
today = date.today()
nationwide_lockdown_status = [{"Country": "Singapore", "Lockdown Start": "2020/04/07", "Lockdown End": "2020/06/01"},
                              {"Country": "United Kingdom", "Lockdown Start": "2020/03/23", "Lockdown End": "NA"}]

# write to dataframe
nationwide_lockdown_status_df = pd.DataFrame(nationwide_lockdown_status)
nationwide_lockdown_status_df = nationwide_lockdown_status_df[["Country", "Lockdown Start", "Lockdown End"]]

# define figure
fig = plt.figure()
# define axis
ax1 = plt.subplot2grid((1,1), (0,0))

# define data (x, y, data, label for legend, and color)
ax1.plot(sg_df.index, "Adj Close", data = sg_df, label='Singapore', color = "c")

# set x-axis values to 45 degree angle
for label in ax1.xaxis.get_ticklabels():
    label.set_rotation(45)
ax1.grid(True, color = "k", linestyle = "-", linewidth = 0.3)

plt.xlabel("Year")
# label y-axis as "Adjusted Closing Value ($)"
plt.ylabel("Adjusted Closing Value ($)")
# create legend and put legend outside of chart
plt.gca().legend(loc='center left', bbox_to_anchor=(1, 0.5), title = "Country Index")
# Title for chart
plt.title("Countries index by Year")
plt.show();

编辑

从那以后,我找到了一个临时解决办法

for x in nationwide_lockdown_status:
country = x["Country"]
lockdownStartDate = x["Lockdown Start"]
lockdownEndDate = x["Lockdown End"]
if ax1:
    country1 = "Singapore"
    if country1 == country:
        plt.axvline(pd.Timestamp(lockdownStartDate), color = "g", alpha = 0.5)
        plt.axvline(pd.Timestamp(lockdownEndDate), color = "r", alpha = 0.5)

Tags: dfdateplotasstatuspltsgcountry