Overblog Suivre ce blog
Editer l'article Administration Créer mon blog

Une courbe d'iso-intensité avec matplotlib (chapitre 2)

1 Mai 2010 , Rédigé par Roger Bunivot Publié dans #source

Changer intéractivement les contours:

Après avoir créé la figure, il est temps d'attribuer des actions aux boutons définis précédemment


Commençont par définir une fonction pour changer intéractivement les contours.

La solution la plus simple et efficace que j'ai trouvé pour choisir les contours consiste à choisir la valeur du contour maximum (bigS), le nombre de contours (ct_tmpS) affiché ainsi que l'écart entre les contours (factorS).

 

#definition de la fonction update qui permet de changer les contours

#la fonction prend un argument (les valeurs des curseurs).

 

def update(val):
  # attention en python les indentations (espace en début de ligne)
  # définisse les blocs, comme ici une fonction.
  # récupérer les valeurs des curseurs (sliders)
  # un coefficient pour le choix du contour maximum
  bigS = float(sct_max.val)
  # le nombre de contours
  ct_tmpS = int(sct.val)
  # choix de l'écart entre les coutours
  factorS = float(sct_factor.val)
  # attention on peut avoir des contours positif ou négatifs
  # on va considérer que l'on a autant de chaque et donc ne définir un nombre
  #qui sera la moitié du nombre total.
  # déterminer le maximum:
  # le maximum est-il positif?
  if np.abs(Z.max()) > np.abs(Z.min()):
      val_ct = np.abs(Z.max())
  else:
      val_ct = np.abs(Z.min())
  # initialisation d'une liste de contours:
  mes_contours = []
  # afficher le maximum n'affichera qu'un point pas très joli
  val_tmp = val_ct * bigS
  # creation des contours
  for i in range(ct_tmpS):
    mes_contours.append(val_tmp)
    mes_contours.append(val_tmp*-1)
    val_tmp = val_tmp/factorS
  # je ne pense pas que ce soit important mais c'est plus joli
  #si on range les contours dans l'ordre
  mes_contours.sort()

  #Si on a fait un zoom et que l'on veut le garder

  #on récupère les limites du graphique

  X_zoom = ax.get_xlim()
  Y_zoom = ax.get_ylim()

  # effacer le graph pour tracer le nouveau avec les nouvelles valeurs

  ax.clear()
  CS = ax.contour(X,Y,Z, mes_contours)

  #Retrouver le zoom
  ax.set_xlim(X_zoom)
  ax.set_ylim(Y_zoom)

  plt.draw()
# la fonction est terminée, maintenant il faut relier les boutons à la fonction.
sct.on_changed(update)
sct_factor.on_changed(update)
sct_max.on_changed(update)

 

Normalement le copier coller devrait fonctionné, bien sur il est nécessaire d'exécuter le code de création de la figure d'abord.

 

En jouant sur les curseurs on il est alors facile de choisir le contour que l'on veut:

contour_plot2.png

Remarque,  dans ce script on retrace entièrement le contour plot, on ne fait pas qu'un changement des valeurs des contours. Pour les courbes du type y =plot(data), il est possible de ne changer que les de y. On en verra une utilisation plus tard.

Il reste a attribué les boutons set levels et reset, ce sera pour une prochaine fois.

Partager cet article

Repost 0

Commenter cet article