我在使用库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'})
到目前为止,我尝试过:
factorplot
+ factorplot
将两个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)
factorplot
+ gmap.(factorplot)
我因此尝试使用sns.factorplot
,我认为使用具有完全相同设计和类别的新数据集在顶部生成FacetGrid
和g.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)
答案 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()