首页 > 解决方案 > 使用数据框中的列为 seaborn 图的背景着色

问题描述

问题

如何使用数据框的一列对 seaborn 图的背景进行着色着色?

代码片段

import numpy as np
import seaborn as sns; sns.set()
import matplotlib.pyplot as plt
fmri = sns.load_dataset("fmri")
fmri.sort_values('timepoint',inplace=True)
ax = sns.lineplot(x="timepoint", y="signal", data=fmri)
arr = np.ones(len(fmri))
arr[:300] = 0
arr[600:] = 2
fmri['background'] = arr

ax = sns.lineplot(x="timepoint", y="signal", hue="event", data=fmri)

这产生了这个图表:
实际输出

期望的输出

'background'根据新列中的值以及任何调色板或用户定义的颜色,我想拥有什么,如下所示:

期望的输出

标签: pythonpandasdataframegraphseaborn

解决方案


ax.axvspan()可以为你工作,假设背景不会在时间点上重叠。

import numpy as np
import seaborn as sns; sns.set()
import matplotlib.pyplot as plt
fmri = sns.load_dataset("fmri")
fmri.sort_values('timepoint',inplace=True)
arr = np.ones(len(fmri))
arr[:300] = 0
arr[600:] = 2
fmri['background'] = arr
fmri['background'] = fmri['background'].astype(int).astype(str).map(lambda x: 'C'+x)

ax = sns.lineplot(x="timepoint", y="signal", hue="event", data=fmri)
ranges = fmri.groupby('background')['timepoint'].agg(['min', 'max'])
for i, row in ranges.iterrows():
    ax.axvspan(xmin=row['min'], xmax=row['max'], facecolor=i, alpha=0.3)

在此处输入图像描述


推荐阅读