2017-10-17 9 views
1

Je souhaite tracer des tracés catégoriels avec le pointpoint Seaborn, mais les points de données qui ne sont pas adjacents ne sont pas connectés à une ligne dans le tracé. Je voudrais interpoler entre les points non adjacents, et les relier de la même façon que les points adjacents sont connectés, comment puis-je faire cela? Exemple: Dans les images de gauche et du milieu, les points bleu et vert doivent être reliés respectivement à une courbe, mais ils sont maintenant séparés en petites parties. Comment puis-je tracer les images de gauche et du milieu comme la bonne?Connexion de points de données non adjacents dans le pointplot Seaborn

enter image description here

fig, axs = plt.subplots(ncols=3, figsize=(10,5)) 
exp_methods = ['fMRI left', 'fMRI right', 'MEG'] 
for i in range(3): 
    experiment = exp_methods[i] 
    dataf = df[df['data']==experiment]  
    sns.pointplot(x='number_of_subjects', y='accuracy', hue='training_size', data=dataf, 
       capsize=0.2, size=6, aspect=0.75, ci=95, legend=False, ax=axs[i]) 
+0

Je suggère de ne pas utiliser seaborn alors. Utilisez simplement un diagramme de dispersion ou de ligne habituel avec des barres d'erreur dans matplotlib. – ImportanceOfBeingErnest

Répondre

0

Je ne pense pas qu'il y ait une option pour interpoler où il y a des points de données manquantes, et par conséquent la ligne des arrêts à la place. This question sur le même sujet à partir de 2016 reste sans réponse.

Au lieu de cela, vous pouvez utiliser plt.errorbar comme suggéré dans les commentaires, ou ajoutez les lignes à l'aide de la suite plt.plot tout en utilisant Seaborn pour tracer les moyens et les barres d'erreur:

import seaborn as sns 

tips = sns.load_dataset('tips') 

# Create a gap in the data and plot it 
tips.loc[(tips['size'] == 4) & (tips['sex'] == 'Male'), 'size'] = 5 
sns.pointplot('size', 'total_bill', 'sex', tips, dodge=True) 

enter image description here

# Fill gap with manual line plot 
ax = sns.pointplot('size', 'total_bill', 'sex', tips, dodge=True, join=False) 

# Loop over the collections of point in the axes and the grouped data frame 
for points, (gender_name, gender_slice) in zip(ax.collections, tips.groupby('sex')): 
    # Retrieve the x axis positions for the points 
    x_coords = [coord[0] for coord in points.get_offsets()] 
    # Manually calculate the mean y-values to use with the line 
    means = gender_slice.groupby(['size']).mean()['total_bill'] 
    ax.plot(x_coords, means, lw=2) 

enter image description here

+0

Merci beaucoup. J'ai une autre question, sur les images de gauche et du milieu, l'écart entre deux valeurs adjacentes sur l'axe des x devrait être différent, mais maintenant ils sont identiques, comment puis-je changer cela? –

+0

@emmaqqq Pas d'inquiétude, veuillez accepter cette réponse (cliquez sur la coche) si elle a résolu votre problème. Ensuite, je peux fermer la question à laquelle je suis lié en tant que doublon de ceci. Pour votre commentaire, s'il vous plaît ouvrir une nouvelle question et n'hésitez pas à le lier ici. –

+0

@emmaqqq J'ai oublié de dire: Pour votre nouvelle question, essayez d'inclure un échantillon de données, afin que les autres puissent facilement reproduire votre problème et vous aider. Une bonne ressource sont les ensembles de données Seaborn, n'hésitez pas à réutiliser le code de ma réponse ici. –