使用数据框中的列为 seaborn 图的背景着色

Posted

技术标签:

【中文标题】使用数据框中的列为 seaborn 图的背景着色【英文标题】:Colorize the background of a seaborn plot using a column in dataframe 【发布时间】:2020-07-08 06:56:53 【问题描述】:

问题

如何使用dataframe 的列为seaborn 绘图的背景 着色或着色?

代码 sn-p

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' 和任何palette 或用户定义的colors 中的值,我想拥有什么,如下所示:

【问题讨论】:

background 的值似乎遍布timepoint。你如何决定哪个部分先/最后? 嗯,抱歉,实际上我没有花时间正确查看数据。现在应该修好了。感谢您指出这一点。 【参考方案1】:

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)

【讨论】:

为什么图表上会弹出第三条线? ;-) 糟糕!我包括了两个情节!应删除此行:ax = sns.lineplot(x="timepoint", y="signal", data=fmri) 这将如何适用于多个方面,例如 seaborn 中的 relplot 或其他 FacetGrid 选项? 我认为 FacetGrid 对象的 .map().map_dataframe() 方法可能会有所帮助。在文档中有这些方法的示例。 seaborn.pydata.org/generated/seaborn.FacetGrid.html

以上是关于使用数据框中的列为 seaborn 图的背景着色的主要内容,如果未能解决你的问题,请参考以下文章

Seaborn 散点图 X 和 Y 的颜色

SpriteKit:一种将大型纹理列为缩略图的有效方法

如何绘制从不同列着色的堆叠 seaborn 直方图

多个重叠图的 Seaborn 图例修改

洛谷 P2819 图的m着色问题

如何在Seaborn barplot Python中根据名称为单个条着色[重复]