FacetGrid传说空

时间:2015-03-11 16:30:27

标签: matplotlib seaborn

我正在尝试创建一个seaborn FacetGrid,以显示我拥有的某些数据中集群之间的转换概率。数据有一堆主题和4个集群(因此每个主题有16个数据点,每对新旧集群一个)。因为这些是概率,所有具有相同旧群集的值(对于每个主题)总和为1.我想使用FacetGrid点图(或堆叠的条形图,但这似乎不适用于seaborn)显示此数据,例如每个旧群集都是一个单独的列,新群集是一个单独的色调,每个方面都显示主题与概率。

这是生成具有与我相同功能的玩具DataFrame的代码,以及我想制作的facetgrid的代码。但是,当我这么做时,传说是空的。

df,index = [],0
for subj in [1,2]:
    for i,j in itertools.product(range(4),range(4)):
        df.append(pd.DataFrame(index=[index],data=dict(subject=subj,old=i,new=j,prob=[.23,.24,.26,.27][j])))
        index+=1
df = pd.concat(df)
g = sns.FacetGrid(df,col='old',hue='new',margin_titles=False,legend_out=True)
g.map(sns.pointplot,'subject','prob',join=False)
g.add_legend()

查看g._legend_data表示它是空的,每个轴get_legend_handles_labels()函数都不返回任何内容。发生了什么事?

我无法发布我的情节图像,因为我没有10个声望;传奇的名字出现在最右边,但没有任何内容......

编辑:此外,我想稍微躲避这些值,但是g.map(sns.pointplot,'subject','prob',join=False,dodge=.1)看起来与上面完全相同,因为各种不同的躲闪值...

编辑2:因此,似乎使用sns.factorplot代替FacetGrid,传奇和闪避都可以使用。使用sns.factorplot我唯一不能做的就是旋转xtick标签,但是在Facet Grid中无法使用col_wrap ...为什么FacetGrid会出现这个问题?

1 个答案:

答案 0 :(得分:3)

如您所知,factorplot为使用pointplotFacetGrid提供了一个更简单的界面。传说和躲避原因并非如此,原因是您在hue中设置FacetGrid并在pointplot中设置它是不同的。当您在没有pointplot变量的情况下致电hue时,它不知道如何躲闪,并且它不认为需要添加任何图例数据。

选项一是移动到使用hue变量的位置:

g = sns.FacetGrid(df,col='old', col_wrap=2)
g.map(sns.pointplot, 'subject', 'prob', 'new', dodge=.1, join=False)
g.add_legend()

enter image description here

但我无法想出以这种方式使用FacetGrid而不仅仅使用factorplot的任何理由:

g = sns.factorplot(x="subject", y="prob", hue="new", data=df,
               col="old", col_wrap=2, size=3,
               dodge=.1, join=False)

enter image description here

因此唯一剩下的问题是旋转x轴刻度标签。 factorplot会返回FacetGrid个实例,因此原则上应该很容易使用其他FacetGrid方法来调整绘图。我怀疑你得到的问题是this bug,这将在下一个版本中修复。与此同时,您可以这样解决:

g = sns.factorplot(x="subject", y="prob", hue="new", data=df,
                   col="old", col_wrap=2, size=3,
                   dodge=.1, join=False)
for ax in g.axes:
    plt.setp(ax.get_xticklabels(), rotation=45)

enter image description here