2017-10-17 2 views
1

Ich möchte kategorische Plots mit dem Seaborn Pointplot plotten, aber Datenpunkte, die nicht benachbart sind, sind nicht mit einer Linie in der Zeichnung verbunden. Ich möchte zwischen nicht benachbarten Punkten interpolieren und sie auf die gleiche Weise verbinden, wie benachbarte Punkte verbunden sind, wie kann ich das tun?Verbinden nicht benachbarter Datenpunkte in Seaborn Pointplot

Ein Beispiel: Im linken und mittleren Bild sollten die blauen und grünen Punkte jeweils mit einer Kurve verbunden sein, jetzt sind sie in kleine Teile getrennt. Wie kann ich die linken und mittleren Bilder genau wie die richtige darstellen?

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

Ich würde vorschlagen, Seaborn dann nicht zu verwenden. Verwenden Sie einfach ein gewöhnliches Streu- oder Liniendiagramm mit Fehlerbalken in Matplotlib. – ImportanceOfBeingErnest

Antwort

0

Ich glaube nicht, gibt es eine Option zu interpolieren ist, wo es fehlt Datenpunkte und damit die Linie statt stoppt. This question zum gleichen Thema von 2016 bleibt unbeantwortet.

Stattdessen könnten Sie plt.errorbar verwenden, wie in den Kommentaren vorgeschlagen, oder fügen Sie die Zeilen danach plt.plot mit, während immer noch Seaborn mit den Mitteln und Fehlerbalken zu zeichnen:

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

Vielen Dank. Ich habe noch eine Frage, auf der linken und mittleren Bilder, die Lücke zwischen zwei benachbarten Werten auf der X-Achse sollte anders sein, aber jetzt sind sie gleich, wie kann ich das ändern? –

+0

@emmaqqq Keine Sorge, bitte akzeptieren Sie diese Antwort (klicken Sie auf das Häkchen), wenn das Problem gelöst wurde. Dann kann ich die Frage, die ich verlinkt habe, als ein Duplikat davon schließen. Für Ihren Kommentar, bitte öffnen Sie eine neue Frage und fühlen Sie sich frei, sie hier zu verlinken. –

+0

@emmaqqq Ich habe vergessen zu sagen: Versuchen Sie für Ihre neue Frage, einen Beispieldatensatz aufzunehmen, damit andere Ihr Problem problemlos reproduzieren und Ihnen helfen können. Eine gute Ressource sind die Seaborn-Beispieldatensätze. Hier können Sie Code aus meiner Antwort wiederverwenden. –