叠加两个seaborn factorplots

时间:2018-04-27 05:53:40

标签: python matplotlib plot seaborn facet-grid

我在使用库seaborn超级强加(覆盖)两个factorplots时遇到了困难。

一般的问题是,我想在所有(背景数据)中绘制细灰线,然后在彩色,粗,线上绘制我们想要突出显示的数据。首先,我没有成功地将两个数据集合在一个带有FacetGrid的图中,其次我使用zorder时遇到了问题。

我使用exercise数据集做了一个虚拟示例:

sns.set_style('whitegrid')
exercise = sns.load_dataset("exercise")
background = exercise.assign(idkind = lambda df: df['id'].astype(str)+df.kind.astype(str))
foreground = exercise.groupby(['kind','time']).mean().reset_index().rename(columns={'id':'idkind'})

到目前为止,我尝试过:

  1. factorplot + factorplot
  2. 将两个factorplot绘制为sns.pointplot两次,类似于this example。由于数据的实验设置,我需要sns.factorplot。这不起作用,因为只产生了两个独立的图。我基本上希望在较高的情节之上使用较低的情节。

    g=sns.factorplot(x="time", y="pulse", hue='idkind', col='kind', legend=False,color='lightgrey',data=background)
    sns.factorplot(x="time", y="pulse", hue="kind", data=foreground)
    

    enter image description here

    1. factorplot + gmap.(factorplot)
    2. 我因此尝试使用sns.factorplot,我认为使用具有完全相同设计和类别的新数据集在顶部生成FacetGridg.map第二sns.factorplot 。结果是,它不是使用相同的子图,而是创建了一些带有重复图的行。

      g=sns.factorplot(x="time", y="pulse", hue='idkind', col='kind', legend=False,color='lightgrey',data=background)
      g.map(sns.factorplot, x="time", y="pulse",hue='idkind', col='kind', data=foreground)
      

      enter image description here

      1. factorplot + g.map(pointplot)
      2. g.map一个点图,它将整个数据集放在所有子图中,而不是FacetGrid的设计。

        g=sns.factorplot(x="time", y="pulse", hue='idkind', col='kind', legend=False,color='lightgrey',data=background)
        g.map(sns.pointplot,x="time", y="pulse", hue='idkind', col='kind', data=foreground,zorder='1000')
        

        enter image description here

1 个答案:

答案 0 :(得分:1)

应该提到的是,对factorplot的每次调用都会创建自己的数字。因此,一般来说,如果目标是拥有一个数字,则不能多次调用factorplot。这解释了为什么1.和2.根本无法工作。

对于3.,这也是我的第一次尝试(除了zorder应该可能是一个数字,而不是一个字符串)。
但是,似乎忽略了zorder或者至少没有正确地将zorder传递给底层的matplotlib函数。

选项是手动设置zorder。以下循环遍历背景图中的所有艺术家,并将其zorder设置为1.它还将这些艺术家存储在列表中。 在创建前景图之后,可以再次循环遍历所有艺术家,并将zorder设置为更高的值,以用于那些不在先前存储的列表中的艺术家。

我完全忽略了foreground,因为这似乎只是计算平均值,这将由点图自动完成。

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_style('whitegrid')
exercise = sns.load_dataset("exercise")
background = exercise.assign(idkind = lambda df: df['id'] \
                            .astype(str)+df.kind.astype(str))

g=sns.factorplot(x="time", y="pulse", hue='idkind', col='kind', 
                 legend=False,color='lightgrey',data=background)

backgroundartists = []
for ax in g.axes.flat:
    for l in ax.lines + ax.collections:
        l.set_zorder(1)
        backgroundartists.append(l)

g.map(sns.pointplot, "time", "pulse")

for ax in g.axes.flat:
    for l in ax.lines + ax.collections:
        if l not in backgroundartists:
            l.set_zorder(5)

plt.show()

enter image description here