2017-08-23 2 views
1

Bei der folgenden:Seaborn FacetGrid PointPlot Label-Datenpunkte

import seaborn as sns 
attend = sns.load_dataset("attention") 
sns.set_style("whitegrid", {'axes.grid' : False,'axes.edgecolor':'none'}) 
g = sns.FacetGrid(attend, col="subject", col_wrap=5, 
size=1.5, ylim=(0, 10)) 
ax = g.map(sns.pointplot, "solutions", "score", scale=.7) 

Ich möchte einzelne Datenpunkte markieren in jeder Zeile (Wertelabels anstelle von Punkten setzen). In einer anderen Handlung, die ich nur über matplotlib geschaffen, das wie dies erreicht wurde:

for i, text in enumerate(ind): 
    a.annotate(str(y[i])[:-2], xy=(ind[i], y[i]),fontsize=6, color=c, 
       bbox=dict(pad=.9,alpha=1, fc='white',color='none'),va='center', ha='center',weight='bold') 

Da jedoch gibt es keine ind definiert, ich bin nicht sicher, wie dies funktionieren würde.

Antwort

2

Ich würde nicht wissen, was ind ist entweder. Aber wenn das Ziel, die Punkte mit ihren Koordinaten zu annotieren, können Sie ax.annotate in einer Funktion verwenden, das die FacetGrid abgebildet wird, wie folgt:

import matplotlib.pyplot as plt 
import seaborn as sns 

attend = sns.load_dataset("attention") 
sns.set_style("whitegrid", {'axes.grid' : False,'axes.edgecolor':'none'}) 
g = sns.FacetGrid(attend, col="subject", col_wrap=5, 
        size=1.5, ylim=(0, 10)) 

def f(x,y, **kwargs): 
    ax = sns.pointplot(x,y,**kwargs) 
    ax.axhline(5, alpha=0.5, color='grey') 
    for i in range(len(x)): 
     ax.annotate(str(y.values[i]), xy=(x.values[i]-1, y.values[i]),fontsize=8, 
        xytext = (0,10), textcoords="offset points", 
       color=kwargs.get("color","k"), 
       bbox=dict(pad=.9,alpha=0.2, fc='limegreen',color='none'), 
       va='center', ha='center',weight='bold') 

g.map(f, "solutions", "score", scale=.7) 

plt.show() 

enter image description here

Möglicherweise müssen Sie xy=(i, y.values[i]) in der verwenden Annotation, abhängig davon, wie die Daten aussehen.

Beachten Sie, dass dies auch your previous question beantwortet, indem Sie die axhline in diese Funktion einfügen.

Wenn das Ziel darin besteht, die Punkte durch die Anmerkungen zu ersetzen, verwenden Sie xytext = (0,0) oder lassen Sie dieses Argument vollständig aus; dann hält auch bbox=dict(pad=.9,alpha=1, fc='w',color='none') und markers="" im Funktionsaufruf verwenden:

import matplotlib.pyplot as plt 
import seaborn as sns 

attend = sns.load_dataset("attention") 
sns.set_style("whitegrid", {'axes.grid' : False,'axes.edgecolor':'none'}) 
g = sns.FacetGrid(attend, col="subject", col_wrap=5, 
        size=1.5, ylim=(0, 10)) 

def f(x,y, **kwargs): 
    ax = sns.pointplot(x,y,**kwargs) 
    ax.axhline(5, alpha=0.5, color='grey') 
    for i in range(len(x)): 
     ax.annotate(str(y.values[i]), xy=(i, y.values[i]),fontsize=8, 
       color=kwargs.get("color","k"), 
       bbox=dict(pad=.9,alpha=1, fc='w',color='none'), 
       va='center', ha='center',weight='bold') 

g.map(f, "solutions", "score", scale=.7, markers="") 

plt.show() 

enter image description here

+0

Vielen Dank. Ich nehme an, dass ich mit xy = (i, y.values ​​[i]) in der Anmerkung die Punkte durch die tatsächlichen Werte ersetzen kann, solange ich eine Box darum habe. –

+0

Ich habe dich vielleicht missverstanden. Die aktualisierte Antwort kann dann mehr sein, was Sie wollen. – ImportanceOfBeingErnest

+0

Unglaublich bearbeiten! Ich bin gerade in Ehrfurcht. –

Verwandte Themen