2017-05-14 1 views
0

J'ai besoin de rafraîchir un tracé de barres matplotlib après un clic de souris. L'intrigue doit prendre la valeur event.ydata et replacer les données en fonction de celle-ci. J'ai été en mesure de récupérer cette valeur à partir de l'événement souris, mais lorsque j'essaie de rafraîchir l'intrigue, rien ne semble se produire. Voici mon code:Rafraîchir le tracé après un clic de souris

#df is a pd.DataFrame, I have to plot just the df_mean with error bars (marginOfError) 
df_mean = df.mean(axis=1) 
df_std = df.std(axis=1) 
marginOfError = 1.96*df_std/np.sqrt(3650) 

index = np.arange(4) 

def print_data(threshold):  
    colors = [] 

    for i,err in zip(df_mean,marginOfError): 
     if(i + err < threshold): 
      colors.append('#001f7c') 
     elif(i - err > threshold): 
      colors.append('#bc0917') 
     else: 
      colors.append('#e0d5d6') 

    fig, ax = plt.subplots() 

    plt.bar(index, df_mean, 0.85, 
        alpha=0.85, 
        color=colors, 
        yerr=marginOfError) 

    plt.xticks(index, df.index) 

    #horizontal threshold line 
    ax.plot([-0.5, 3.5], [threshold, threshold], "c-") 

# first print data with a given threshold value 
print_data(df_mean.iloc[1]) 

def onclick(event): 
    plt.gca().set_title('{}'.format(event.ydata)) 
    print_data(event.ydata)  

plt.gcf().canvas.mpl_connect('button_press_event', onclick) 
fig.canvas.draw() 

Qu'est-ce que je fais mal?

Répondre

1

Vous voudrez probablement tracer chaque nouvelle parcelle dans la même figure. Par conséquent, vous devez créer la figure et les axes en dehors de la fonction appelée de façon répétée. Mettez donc fig, ax = plt.subplots() en dehors de la fonction, et à l'intérieur vous pouvez effacer les axes, ax.clear() avant de dessiner un nouveau tracé.

A la fin, vous avez besoin de redessiner réellement la toile en mettant

plt.gcf().canvas.draw_idle() 

à la fin de la fonction onclick.

+0

Merci, cela fonctionne parfaitement! –