User Tools

Site Tools


nicolas_yvon:solution_homework1

Rapport de travail n°1

Dans le cadre de ce quatrième TD en bio-informatique, il nous a été demandé de choisir un algorithme parmi trois pour afficher des données. Nous avons choisi d’implémenter l’algorithme numéro 3 : Icicle Plots car il nous a semblé simple à mettre en place et facile à comprendre.

L’implémentation de l’Icicle Plots s’est faite en développant deux méthodes. La première, nb_leaves, est une fonction récursive qui permet de calculer la position finale du noeud dans le graphe ainsi que sa largeur en fonction de son nombre de feuille (fils tout au bout du graphe). La seconde, icicle, prend en paramètre un graphe et permet de lancer la fonction précédente afin d’obtenir les postions ainsi que la taille de chaque noeud dans l’affichage final, généré dans la suite de la fonction. Pour le côté animation, nous avons simplement ajouté un sleep(0.1) dans la boucle qui parcourt tous les noeuds du graphe ainsi qu’une mise à jour de l’affichage (et un recentrage) afin de voir les modifications au fur et à mesure.

Pour conclure, ce td nous aura permis de mettre en application un algorithme en Python pour l’affichage de données sous forme d’arbre et d’apprendre à manipuler le logiciel Tulip.

icicle.py
# Powered by Python 2.7
 
# To cancel the modifications performed by the script
# on the current graph, click on the undo button.
 
# Some useful keyboards shortcuts : 
#   * Ctrl + D : comment selected lines.
#   * Ctrl + Shift + D  : uncomment selected lines.
#   * Ctrl + I : indent selected lines.
#   * Ctrl + Shift + I  : unindent selected lines.
#   * Ctrl + Return  : run script.
#   * Ctrl + F  : find selected text.
#   * Ctrl + R  : replace selected text.
#   * Ctrl + Space  : show auto-completion dialog.
 
from tulip import *
from time import *
 
# the updateVisualization(centerViews = True) function can be called
# during script execution to update the opened views
 
# the pauseScript() function can be called to pause the script execution.
# To resume the script execution, you will have to click on the "Run script " button.
 
# the runGraphScript(scriptFile, graph) function can be called to launch another edited script on a tlp.Graph object.
# The scriptFile parameter defines the script name to call (in the form [a-zA-Z0-9_]+.py)
 
# the main(graph) function must be defined 
# to run the script on the current graph
 
 
 
# Cette fonction récursive permet de calculer la largeur de chaque noeud de notre graphe
# en calculant le nombre de feuilles à l'extrémité des branches à partir du noeud donné.
# De plus, cette fonction calcule la position finale du noeud dans le graphe final.
def nb_leaves(node,heigh,posX,node_width,node_pos):
	x = posX 
	h = heigh
	# si le noeud actuel n'a pas de fils alors c'est une feuille et sa largeur est donc de 1
	if not graph.getOutNodes(node).hasNext(): 
		node_width[node.id] = 1
		width = 1
	# sinon, il faut calculer la largeur du noeud en fonction du nombre de feuilles au bout de ses fils
	# et on en déduit la position du noeud
	else:
		width = 0
		# on parcourt tous les fils de notre noeud
		for i in graph.getOutNodes(node) :
			nb_l = nb_leaves(i, heigh+1,posX,node_width,node_pos)
			width = width + nb_l
			posX = posX + nb_l
		node_width[node.id] = width
		heigh = heigh + 1
	# on crée les coordonnées du noeud
	node_pos[node.id] = tlp.Vec3f(x,h,0)
	# on renvoie la largeur du noeud
	return width
 
 
# Lancement de l'algorithme:
# Création de 2 tableaux qui vont contenir les largeurs
# Et la position des noeuds
def icicle(graph):
	node_width = {}
	node_pos = {}
	# Taille de l'épaisseur de chaque rectangle
	sizeSquareEdge = 4
	# Taille de la marge de chauqe rectangle
	widthBorderEdge =1
	# root contient le noeud source du graphe
	root = graph.getSource()
	# heigh représente la hauteur de base du graphe
	heigh = 0
	# posX représente la cordonnée en X où va commencer le graphe.
	posX = 0
	# Lance la fonction récursive permettant calculer le nombre de feuilles de chaque noeud
	nb_leaves(root,heigh,posX,node_width,node_pos)
	# Changement des propriétés d'affichage de chaque noeud en fonction de sa taille (en fonction de son nombre de feuille)
	# et de la hauteur mais aussi, gestion de l'animation par pause successive après chaque actualisation de noeuf
	for n in graph.getNodes():
		graph.getStringProperty("viewLabel")[n] = str(node_width[n.id])
		graph.getIntegerProperty("viewShape")[n] = tlp.NodeShape.Square
		graph.getSizeProperty("viewSize")[n] = tlp.Size(node_width[n.id]*sizeSquareEdge,sizeSquareEdge,0)
		graph.getDoubleProperty("viewBorderWidth")[n] = widthBorderEdge
		graph.getColorProperty("viewColor")[n] = tlp.Color.Red
		graph.getColorProperty("viewBorderColor")[n] = tlp.Color.Azure
		graph.getLayoutProperty("viewLayout")[n] = tlp.Coord(node_pos[n.id].getX()*sizeSquareEdge + node_width[n.id]*2,-node_pos[n.id].getY()*sizeSquareEdge,0)	
		sleep(0.1)
		updateVisualization()
 
 
def main(graph): 
	viewBorderColor =  graph.getColorProperty("viewBorderColor")
	viewBorderWidth =  graph.getDoubleProperty("viewBorderWidth")
	viewColor =  graph.getColorProperty("viewColor")
	viewFont =  graph.getStringProperty("viewFont")
	viewFontSize =  graph.getIntegerProperty("viewFontSize")
	viewLabel =  graph.getStringProperty("viewLabel")
	viewLabelBorderColor =  graph.getColorProperty("viewLabelBorderColor")
	viewLabelBorderWidth =  graph.getDoubleProperty("viewLabelBorderWidth")
	viewLabelColor =  graph.getColorProperty("viewLabelColor")
	viewLabelPosition =  graph.getIntegerProperty("viewLabelPosition")
	viewLayout =  graph.getLayoutProperty("viewLayout")
	viewMetaGraph =  graph.getGraphProperty("viewMetaGraph")
	viewMetric =  graph.getDoubleProperty("viewMetric")
	viewRotation =  graph.getDoubleProperty("viewRotation")
	viewSelection =  graph.getBooleanProperty("viewSelection")
	viewShape =  graph.getIntegerProperty("viewShape")
	viewSize =  graph.getSizeProperty("viewSize")
	viewSrcAnchorShape =  graph.getIntegerProperty("viewSrcAnchorShape")
	viewSrcAnchorSize =  graph.getSizeProperty("viewSrcAnchorSize")
	viewTexture =  graph.getStringProperty("viewTexture")
	viewTgtAnchorShape =  graph.getIntegerProperty("viewTgtAnchorShape")
	viewTgtAnchorSize =  graph.getSizeProperty("viewTgtAnchorSize")
 
	icicle(graph)

Morgane Badré et Nicolas Yvon

/net/html/perso/melancon/Visual_Analytics_Course/data/pages/nicolas_yvon/solution_homework1.txt · Last modified: 2014/10/19 23:36 by yvon