FacetGrid可视化中如何在行之间共享x轴,在列之间共享y轴?

14

seabornFacetGrid函数创建了一个子图网格,允许您在数据集中探索条件关系。

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

share{x,y} : bool, optional

如果为True,则跨列共享y轴和/或跨行共享x轴。

但我没有看到其他任何控制面板/子图共享轴的方法。因此,这里就有了...

问题:

是否有办法在列之间共享x轴,在行之间共享y轴?

我正在尝试获取不同条件(在列和色调中)下不同数量的密度图(在行中)。因此,我希望我的子图在行之间共享x和y轴,但在列之间没有链接。

2个回答

30

虽然它没有得到适当的文档记录,但这些参数直接传递给了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轴,而不是以列为单位分享),以便于视觉比较。


2

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。在这个示例中可以看到。然后,您可以明确指定共享哪些轴。

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()

在这个例子中,我们在行之间共享x轴(每个 i % 5 == 0 )。由于GridSpec对象只是一个轴的numpy数组,因此我们可以以任何方便的顺序初始化它们并根据需要共享轴。使用GridSpec,您有更多的自定义选项,但是seaborn的许多好处(色调等)都必须手动编码。

我知道GridSpec,但是既然使用FacetGrid这么容易,我想避免涉及到那个...不管怎样,还是谢谢! :) - mgab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接