Python绘制时间序列图时指定日期添加vlines垂直线报错如何解决
问题解决方法
报错核心原因
- 类型不匹配:
plt.vlines()接收的x轴位置参数是字符串格式的日期,和图表x轴已有的datetime类型刻度不兼容,无法转换为坐标轴单位触发报错 - 参数缺失:
plt.vlines()的必填入参为x(垂直线x坐标)、ymin(垂直线下端y值)、ymax(垂直线上端y值)三个,删除0,600会导致参数不足报错
额外说明:你代码里covid_indonesia['date'] = pd.to_datetime(covid_indonesia['date'])属于冗余操作,加载数据集时已经通过parse_dates=["date"]将日期列转为了datetime格式,且该操作放在绘图之后也不会对已经绘制的x轴产生作用,还会触发pandas的SettingWithCopyWarning警告。
修正方案
只需要将传入plt.vlines()的日期字符串转为datetime格式即可,修正后的完整代码如下:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 加载数据时已完成日期格式转换,无需后续重复处理 df_covid = pd.read_csv("https://covid.ourworldindata.org/data/owid-covid-data.csv", sep=",", parse_dates=["date"]) # 筛选印尼数据 covid_indonesia = df_covid[df_covid["location"] == "Indonesia"] # 绘图 plt.figure(figsize=(20,7)) sns.lineplot(data=covid_indonesia, x="date", y="new_cases") # 给vlines传入datetime格式的日期参数,和x轴类型匹配,可自定义颜色、线型方便识别 plt.vlines(pd.to_datetime(['2020-01-01', '2021-05-13', '2021-07-03']), ymin=0, ymax=600, color='red', linestyle='--') plt.show()
如果希望垂直线自动适配当前y轴的上下限,不需要手动指定0和600,可以用以下写法动态获取y轴范围:
# 放在sns.lineplot绘图之后、vlines之前执行 ymin, ymax = plt.gca().get_ylim() plt.vlines(pd.to_datetime(['2020-01-01', '2021-05-13', '2021-07-03']), ymin=ymin, ymax=ymax, color='red', linestyle='--')
内容的提问来源于stack exchange,提问作者zizamuft
相关产品推荐
相关产品推荐

