Overblog Suivre ce blog
Administration Créer mon blog

Articles avec #source tag

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

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

Extraire une ligne ou une colonne

Après avoir créé une figure où l'on a tracé des courbes d'iso-intensité, (contours plot), puis avoir ajouté la possibilité de varier les contours intéractivement, Nous allons extraire des lignes ou des colonnes.


  Si l'on a besoin de comparer deux courbes d'iso-intensité il est souvent plus facile de les comparer ligne par ligne ou colonne par colonne.

  On peut aussi vouloir extraire des lignes ou des colonnes afin d'appliquer une correction aux données. Par exemple pour les spectres de résonance magnétique nulcéaire (RMN) il commun d'appliquer une correction de phase.


 On va dans un premier temps activer les boutons "radio" de gauche, "no", "extract", "phase".

Le bouton "no" va permettre de désactiver l'extraction des lignes et des colonnes.

Le bouton "phase" va permettre d'extraire une, deux ou trois  ligne(s) ou colonne de les corriger, puis d'appliquer la correction sur la courbe d'iso-intensitée.

 

Tout d'abord on va définir une fonction qui permet de choisir entre ces trois options.

 

param ={}

def select(label):

  # définir une variable globale qui permettra de rendre le graphique actif.

  global cird

  # definition d'un compteur (pourquoi ne pas utiliser une liste :-)

   # a chaque appel de la fonction select on l'incrémente
  param['compteur'] = param['compteur'] + 1

  # on test ensuite quel bouton est activé et le stock dans la liste
  if label == 'extract':
    param['plot1D'] = label
  elif label == 'phase':
    param['plot1D'] = label
  elif label == 'no':
    param['plot1D'] = label

    # on déconnecte la figure des boutons de la souris
    fig_.canvas.mpl_disconnect(cird)

    # et on réinitialise le compteur
    param['compteur'] = 0

  # on connecte la figure aux boutons de la souris
  if param['compteur'] >= 1:
    cird = fig_.canvas.mpl_connect('button_press_event', onclick)
  return

# initialisation du compteur

param['compteur'] = 0

# appel de la fonction "select" lors du click sur le bouton radio

radio.on_clicked(select)

Lire la suite

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.

Lire la suite

Une courbe d'iso-intensité avec matplotlib

25 Avril 2010 , Rédigé par Roger Bunivot Publié dans #source

La librairie Matplotlib de python permet de tracer toutes sorte de figures. Je vais essayer de présenter ici un exemple de "contour plot" ou courbe iso intensité. Ces courbes permettent de représenter en 2 dimensions, trois informations, x, y, z. On trouve ces représentation dans les cartes ign, alors x et y représentent des distances, z une altitude.  On les utilise aussi en résonnance magnétique nucléaire, alors x,y représentent des fréquences, et z l'intensité du signal.

 


En partant de l'exemple du site de matplotlib, je vais ensuite ajouter diverses options:

 

#!/usr/bin/env python 
"""   ici des commentaires
qui peuvent   à l'occasion s'étaler
sur plusieurs   lignes   """  
import matplotlib #importation du module matplolib
import numpy as np #importation de numpy pratique pour le calcul scientifique
import matplotlib.cm as cm #
import matplotlib.mlab as mlab #
import matplotlib.pyplot as plt #
from matplotlib.widgets import Slider, Button, RadioButtons, Cursor #importation des boutons

#création des données
delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)
#création de la figure
# on va donner un nom à la figure
fig = plt.figure()
# on défini une zone de traçage
ax = fig.add_subplot(111)
# on trace ici les données
CS = ax.contour(X, Y, Z)
# pour afficher la figure
plt.show()
# un truc que j'aime bien une croix que se promène sur le graphique:
cursor = Cursor(ax, useblit=True, color='red', linewidth=1 )
#On va faire un peu de place pour mettre les différents boutons, curseurs de la figure
fig.subplots_adjust(left=0.25, bottom=0.35)
#création de l'emplacement pour les curseurs
# un curseur pour le nombre de contour
ax_ct= plt.axes([0.25, 0.2, 0.65, 0.03])
# un curseur pour definir le maximum tracé
ax_max = plt.axes([0.25, 0.15, 0.65, 0.03])
# un curseur pour definir l'écart entre les contours
ax_factor = plt.axes([0.25, 0.1, 0.65, 0.03])
#création des curseurs
sct = Slider(ax_ct, 'nb contours', 1, 20, valinit=6)
sct_factor = Slider(ax_factor, 'factor', 1, 10, valinit = 2)
sct_max = Slider(ax_max, 'max', 0,1 , valinit = 0.9)
#création de l'emplacement pour les boutons:
resetax = plt.axes([0.8, 0.025, 0.1, 0.04])
button_ax = plt.axes([0.5, 0.025, 0.1, 0.04])
#création des boutons:
# un bouton de réinitialisation
button = Button(resetax, 'Reset')
# un bouton pour définir la hauteur des contours
button_2 = Button(button_ax, 'set levels')
#création pour l'emplacement des puces
rax = plt.axes([0.025, 0.70, 0.15, 0.15])
rax2 = plt.axes([0.025, 0.5, 0.15, 0.15])
#Les puces:
radio = RadioButtons(rax, ('no', 'extract', 'phase'), active=0)
wich_fig = RadioButtons(rax2, ('1', '2', '3'), active = 0)  

Si tout c'est bien passé vous devriez avoir obtenu la figure aux couleurs près:

 

image.pngIl ne reste plus qu'à associer des actions à ces différents boutons voir les chapitres suivant.

 

 

 

 





Lire la suite