Seaborn FacetGrid轴跨行共享x轴/跨列共享Y轴

2024-04-30 05:23:01 发布

您现在位置:Python中文网/ 问答频道 /正文

来自seaborn^{}创建子点网格,允许您探索数据集中的条件关系。

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

share{x,y} : bool, optional

If true, the facets will share y axes across columns and/or x axes across rows.

但我看不到任何其他方法来控制面/子块共享轴的方式。所以。。。

问题:

是否有任何方法可以跨列共享x轴和/或跨行共享y轴?

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


Tags: 数据方法函数网格share参数关系关键字
2条回答

它没有正确的文档记录,但是这些参数直接传递给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轴,而不是在列上共享y轴),以简化视觉比较。

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,如示例here所示。然后可以指定共享的轴。

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(色调等)的许多漂亮部分都必须手动编码。

相关问题 更多 >