Seaborn - FacetGrid轴在行/ y轴上跨列共享x轴

时间:2016-03-15 16:20:00

标签: python matplotlib seaborn

来自seaborn

FacetGrid创建了一个子网格,允许您探索数据集中的条件关系。

该函数接受的两个关键字参数是sharexsharey,根据文档:

  

分享{x,y} :bool,可选

     
    

如果为true,则facet将跨行和/或x轴跨行共享y轴。

  

但我没有看到任何其他方法来控制facets / subplots共享轴的方式。所以来了......

问题:

有没有办法跨行和/或y轴跨行共享x轴?

我正在尝试获得不同条件(列和色调)的不同数量(行数)的密度图。因此,我希望我的子图可以跨行共享x轴和y轴,但不能跨列链接。

2 个答案:

答案 0 :(得分:12)

没有正确记录,但这些参数会直接传递到plt.subplots,这样您就可以将这些参数的值设置为"row""col",以便轴只在行或列中共享,而不是在整个网格中共享。

我不确定我到底想要你的情节看起来如何,但我认为你可以这样做:

tips = sns.load_dataset("tips")
g = sns.FacetGrid(tips, col="smoker", row="time", sharey="col")
g.map(plt.hist, "total_bill")

也就是说,一般来说,我会尝试在整个网格上共享轴(即,将图表结构化为跨行而不是跨列共享y轴)以简化视觉比较。

答案 1 :(得分:1)

FacetGrid对象包含一组轴(网格形状的numpy数组)。您可以在阵列中的每个轴上手动设置轴限制。但这需要大量的迭代/后处理。以下是一个简单的例子。

import pandas as pd
import seaborn as sns
import numpy as np
from matplotlib import pyplot as plt

data = pd.DataFrame({'a':np.random.random(1000), 
                     'b':np.random.random(1000), 
                     'c':np.random.random_integers(0,3,1000),
                     'x':np.random.random_integers(1,5,1000),
                     'y':np.random.random_integers(1,5,1000)})

g = sns.FacetGrid(data=data, col='x', row='y', hue='c', sharex=False, sharey=False)
g.map(plt.scatter, 'a', 'b').add_legend()
for axlist in g.axes:
    for ax in axlist:
        ax.set_ylim(.2,.3)
    break
print(type(g.axes))
plt.show()

但是,如果您不介意跳过seaborn并直接在matplotlib中工作,则可以使用GridSpec对象而不是FacetGrid,如示例{{ 3}}。然后,您可以具体指定共享哪些轴。

import pandas as pd
import seaborn as sns
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import gridspec

data = pd.DataFrame({'a':np.random.random(1000), 
                     'b':np.random.random(1000), 
                     'c':np.random.random_integers(0,3,1000),
                     'x':np.random.random_integers(1,5,1000),
                     'y':np.random.random_integers(1,5,1000)})

colors = ['b', 'r', 'g', 'y']

fig = plt.figure(figsize=(6,6))
gs = gridspec.GridSpec(len(data['x'].unique()),len(data['y'].unique()))
g = data.groupby(['x','y'])
for i, (ind, grp) in enumerate(g):
    if i % 5 == 0: 
        ax = fig.add_subplot(gs[i])
    else:
        ax2 = fig.add_subplot(gs[i], sharex = ax)
        plt.setp(ax2.get_yticklabels(), visible=False)

    subgroups = grp.groupby('c')
    for index, sub in subgroups:
        plt.scatter(sub['a'], sub['b'], color=colors[index])


plt.show()

在此示例中,我们跨行(每个i % 5 == 0)共享x轴。由于GridSpec对象只是一个numpy轴的数组,我们可以按任何方便的顺序初始化它们并按照我们的意愿共享轴。使用GridSpec,您可以进行更多自定义,但seaborn(色调等)的许多优点都必须手动编码。