使用布尔分类时间序列数据绘制 pandas 数据帧

Plotting pandas dataframe with boolean categorical time-series data

我想绘制一个 pandas 形式的数据框

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame()
df['date'] = pd.date_range(start='2021-02-01', end='2021-03-14', freq='D')
df['specimen1'] = 0
df['specimen2'] = 0
df['specimen3'] = 0

df['specimen1'].loc[(df.date >= '2021-02-01') & (df.date <= '2021-02-03')] = 1
df['specimen3'].loc[(df.date >= '2021-02-02') & (df.date <= '2021-02-05')] = 1
df['specimen2'].loc[(df.date >= '2021-02-10') & (df.date <= '2021-02-20')] = 1
df = df.set_index('date')

df.head()

其中 df 包含时间序列数据。这些列包含不同标本(分类数据)的布尔值(true/false)。我如何使用 seaborn 或 matplotlib 绘制它?我想要 x 轴上的类别和 y 轴上的日期——每个 specimen 应该有一条垂直线来表示满足 True 条件的日期范围。在 seaborn 我试过

 sns.catplot(data=df)

但这给了我:

因为它不想在 y 轴上绘制日期。

您可能希望将数据可视化为热图。

代码:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame()
df['date'] = pd.date_range(start='2021-02-01', end='2021-03-14', freq='D')
df['specimen1'] = 0
df['specimen2'] = 0
df['specimen3'] = 0

df['specimen1'].loc[(df.date >= '2021-02-01') & (df.date <= '2021-02-03')] = 1
df['specimen3'].loc[(df.date >= '2021-02-02') & (df.date <= '2021-02-05')] = 1
df['specimen2'].loc[(df.date >= '2021-02-10') & (df.date <= '2021-02-20')] = 1

df['date'] = df['date'].dt.date
df = df.set_index('date')

# Visualize the data as heatmap
plt.rcParams['font.size'] = 14
fig, ax = plt.subplots(1, 1, figsize=(9, 16))
sns.heatmap(df, cmap=sns.light_palette('lightblue'), cbar=False, ax=ax)
ax.set_xlabel('Specimen')
ax.set_ylabel('Date')
ax.set_yticks([i for i in range(len(df))], [i for i in df.index.values])

plt.show()

# Save the figure
# fig.savefig('out.png', bbox_inches='tight', facecolor='white')

图: