使用col,row和hue防止FacetGrid重叠

时间:2016-04-20 00:51:15

标签: python pandas matplotlib data-visualization seaborn

我有一个看起来很好的情节

import seaborn as sns
tips = sns.load_dataset('tips')

sns.violinplot('day', 'total_bill', data=tips, hue='sex')

enter image description here

但是,当我想使用FacetGrid对象创建构面时, 在这个例子中,小提琴被绘制在彼此的顶部。 我如何防止发生这种情况,以便男性和女性彼此相邻?

facet = sns.FacetGrid(tips, col='time', row='smoker', hue='sex',
                 hue_kws={'Male':'blue', 'Female':'green'}).
facet.map(sns.violinplot, 'day', 'total_bill')

enter image description here

2 个答案:

答案 0 :(得分:2)

似乎解决方案是:

import seaborn as sns
facet = sns.FacetGrid(tips, col="time", row='smoker')
facet.map(sns.violinplot, 'day', 'total_bill', "sex")

enter image description here

sex传递到map来电似乎做了我想要的事情。 但是sex分配给的参数的名称是什么? 它不是hue。有人知道这里实际传递了什么吗?

另一种方法是从matplotlib.pyplot

执行准系统修改
import matplotlib.pyplot as plt
import seaborn as sns

facet_fig = plt.figure()
ax1 = facet_fig.add_subplot(2, 2, 1)
ax2 = facet_fig.add_subplot(2, 2, 2)
ax3 = facet_fig.add_subplot(2, 2, 3)
ax4 = facet_fig.add_subplot(2, 2, 4)    

sns.violinplot(x='day', y='total_bill', hue='sex', ax=ax1,
               data=tips[(tips.smoker=='Yes') & (tips.time == 'Lunch')])
sns.violinplot(x='day', y='total_bill', hue='sex', ax=ax2,
               data=tips[(tips.smoker=='Yes') & (tips.time == 'Dinner')])
sns.violinplot(x='day', y='total_bill', hue='sex', ax=ax3,
               data=tips[(tips.smoker=='No') & (tips.time == 'Lunch')])
sns.violinplot(x='day', y='total_bill', hue='sex', ax=ax4,
               data=tips[(tips.smoker=='No') & (tips.time == 'Dinner')])

enter image description here

答案 1 :(得分:2)

@mwaskom提出的更好的解决方案是使用factorplot

sns.factorplot(x='day', y='total_bill', hue='sex', data=tips,
               row='smoker', col='time', kind='violin')

enter image description here