Matplotlib -如何在与第一个图对应的特定日期对齐第二个图

ds97pgxw  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(110)

我有一个2列的df,我用x轴表示日期,y轴表示第一个数据。
然后,我以以下方式使次要数据与第一数据相关联:辅助数据是一个字典,其中key是日期,value是向量。该日期对应于也存在于第一数据集(图)中的特定日期。
在向量的索引20处,该值对应于日期(键)的意义上,向量包括过去和未来值。
我想在第一个图的日期上对齐。任何解决方案都可以(子图,叠加,两个不同的轴)。
理想情况下,我希望将两个数据集绘制在同一个图中,但正确对齐蓝线,如下所示。
下面是一些玩具代码来说明一个例子和问题:

import pandas as pd, numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)

# data
df=pd.DataFrame({'date':pd.date_range('2020-11-30', periods=31),'temp':np.arange(1,32)})

# secondary data for date '2020-12-15', key is date and value is a vector. In this vector index 20 corresponds to the date '2020-12-15'
ml = {'2020-12-15':list(np.random.rand(56))}

fig, axes = plt.subplots(2,1, dpi=120)
axes = axes.flatten()
axes[0].plot(df.date, df.temp, '-o', c='orange',  label='T')
axes[0].tick_params(which='major', labelrotation=90)
axes[1].plot(ml['2020-12-15'], '-o', c='blue', label='ML: 2020-12-15')
plt.tight_layout()
plt.show()

字符串


的数据

alen0pnh

alen0pnh1#

要做到这一点,你需要做两件事。第一个是创建与值对应的日期列表。为此,我为ml创建了一个pandas DataFrame,然后创建了一个date列,该列在索引20处具有所需的日期。但如果你只是画出来,两个坐标轴就不会对齐。要解决这个问题,您需要在创建子图时设置sharex=True

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

plt.close("all")

np.random.seed(0)

# data
df=pd.DataFrame({"date":pd.date_range("2020-11-30", periods=31),"temp":np.arange(1,32)})

# secondary data for date "2020-12-15", key is date and value is a vector. In this vector index 20 corresponds to the date "2020-12-15"
ml = {"2020-12-15":list(np.random.rand(56))}
date_index = 20
ml_df = pd.DataFrame(ml)
ml_df["dates"] = (pd.date_range(ml_df.columns[0], periods=len(ml_df)) 
                  - pd.Timedelta(date_index, "d"))

fig, axes = plt.subplots(2,1, dpi=120, sharex=True)
axes = axes.flatten()
axes[0].plot(df.date, df.temp, "-o", c="orange",  label="T")
axes[1].plot(ml_df["dates"], ml_df["2020-12-15"], "-o", c="blue", label="ML: 2020-12-15")
axes[1].xaxis.set_tick_params(rotation=90)
fig.tight_layout()
fig.show()

字符串


的数据
P.S.你在代码的最后开始对tight_layoutshow使用plt。虽然这样做有效,但您应该坚持使用一个API,无论是显式的“Axes”API(这是您在创建子图并使用ax时所做的)还是隐式的“pyplot”API(使用plt)。有关文档,请参阅此链接。

相关问题