FaceGrid Seaborn中每个方面的特定于FaceGrid的图例

2024-09-29 23:25:21 发布

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

我试图在FacetGrid Seaborn对象的每个方面创建一个方面特定的图例,例如由catplot生成的。 考虑下面的^ {< CD3> },其中{{CD4}}是变量的绘图,相对于分类^ {< CD5> },根据变量{{*CD6}}和(工具)^ {CD7}}在行和列之间刻面。将hue设置为进行测量的特定仪器的序列号。 以下是DataFrame

df = pd.DataFrame({'Condition': ['C1','C2','C1','C2','C1','C1','C2','C1',
                                 'C1','C1', 'C1', 'C2', 'C1', 'C2', 'C1', 'C2', 'C2'],
                   'model': ['Pluto','Pluto','Jupy','Jupy','Jupy','Jupy','Jupy','Jupy',
                             'Jupy', 'Pluto', 'Pluto', 'Pluto', 'Pluto', 'Pluto', 'Jupy', 'Jupy',
                             'Pluto'],
                   'serial': [2520,2520,3568,3568,3568,3580,3580,356,
                              456, 2580, 2580, 2580, 2599, 2599, 2700, 2700, 
                              2560],
                   'measurement': [1.02766,1.0287,1.0099,1.0198,1.0034,1.0036,1.0054,1.0024,
                            1.0035,1.00245,1.00456, 1.01, 1.0023, 1.0024, 1.00238, 1.0115, 
                            1.020],
                   'Lab': ['John','John','John','John','Jack','Jack','Jack','John',
                           'Jack','John', 'Jack', 'Jack', 'Jack', 'Jack', 'John', 'John', 
                           'John']}
                  )

一些方面只包含hue级别的子集,随着级别数量的增加FacetGrid图例变得相当长。受另一个post答案的启发,我选择使用g.axes.ravel()FacetGrid{}中迭代,以获得每个方面的图例:

sns.set_style("ticks")
g = sns.catplot(x='Condition', # returns a FacetGrid object for further editing
            y = 'measurement', 
            data=df, 
            hue='serial',
            row='Lab', 
            col='model',
            s=10,
            kind='swarm',
            dodge=False, 
            aspect = 1,
            sharey = True,
            legend_out = True,
            ).despine(left=True)

for axes in g.axes.ravel():
    axes.legend()
g.savefig('/Users/massimopinto/Desktop/legend_in_facets.png', 
          bbox_inches='tight')

这导致整个FacetGrid对象图例中的绘图相当拥挤,信息过载。我更喜欢的是每个方面的图例,以显示该特定方面中出现的hue级别。 我该怎么做

towards a facet-specific legend

版本:熊猫:1.0.3;seaborn:0.10.0;python:3.7.2


Tags: 对象true级别johnhuejackc2图例
1条回答
网友
1楼 · 发布于 2024-09-29 23:25:21

考虑使用{{CD1>}对象,用^ {CD2>}迭代元素,用相应的值(EM>HUE列)重建每个图例。重要的是,必须在打印前对数据帧进行排序

df = df.sort_values(['Lab', 'model', 'serial']).reset_index(drop=True)

sns.set_style("ticks")
g = sns.catplot(x = 'Condition',                  
                y = 'measurement', 
                data = df, 
                hue = 'serial',
                row = 'Lab', 
                col = 'model',
                s=10,
                kind='swarm',
                dodge=False, 
                aspect = 1,
                sharey = True,
                legend_out = False,               # REMOVE MASTER LEGEND
               ).despine(left=True)

# MASTER SERIES OF serial
ser_vals = pd.Series(df['serial'].sort_values().unique())

for axes, (i, d) in zip(g.axes.ravel(), df.groupby(['Lab', 'model'])):
    handles, labels = axes.get_legend_handles_labels()

    # SUBSET MASTER SERIES OF serial
    vals = ser_vals[ser_vals.isin(d['serial'].unique())]    
    idx = vals.index.tolist()

    if len(idx) > 0:
       axes.legend(handles = [handles[i] for i in idx], 
                   labels = vals.tolist())

Plot Output

相关问题 更多 >

    热门问题