Partage
  • Partager sur Facebook
  • Partager sur Twitter

Les graph networkx sur Python

Afficher les poids des arrêtes (TIPE)

    29 janvier 2017 à 18:14:45

    Bonjour à tous!

    Je code actuellement un programme pour mon TIPE (je suis en classe prépa) et j'ai besoin de tracer des graph. Je vous explique le contexte que vous puissiez vous repérer. On a un message codé et un crib (chaine de caractère plus courte que le message) que l'on suspecte d'être une partie du message codé. On sait que la façon de coder (je travail sur la machine Enigma au passage^^) empêche l'apparition de point fixes, on peut donc déjà supprimer certaines position du crib dans le message. Une fois qu'on a une position valide de notre crib sur le message, on veut afficher (sur un graph) les coincidences entres notre crib et notre message. exemple: message = 'ibsufc', crib = 'abc'. La première superposition est impossible puisque le b serait en commun, la première position possible est donc la deuxième, 'est à celle là qu'on s'intéresse c'est a dire qu'on a b->a, s->b, u->c. Je veux alors créer un graph avec ces lettres pour sommet, les flèches que je viens de faire comme arrêtes et comme indice d'arrête le numéro de la coincidence (2 pour ba, 3 pour sb, 4 pour uc). Voila pour la mise en situation!

    Après quelques recherche j'ai trouvé la bibliothèque networkx qui a des outils avancé pour gérer des graph et les tracer, je me suis donc plongé dans cette documentation! J'ai trouvé pas mal de chose et notamment pour tracer la fonction nx.draw_networkx() mais elle n'affiche pas les 'nom' des arrêtes. Je me suis donc tourné vers la fonction nx.draw_networkx_labels() qui est censé résoudre mon problème sauf que je ne comprend pas ce que je dois mettre dans l'argument pos (j'ai tenté quelques chose dans mon code pour voir ce que ça donnait mais rien de probant). Je n'ai pas d'erreur quand je run ce code mais les nom des arrêtes ne sont pas affiché. j'ai exactement le même résultat qu'avec la fonction draw.networkx()

    Je vous met la doc que j'ai trouvé et mon code.

    Merci d'avance de vos réponses!

    Ali = Alignement(message, crib)#renvoie la liste des positions possibles
    k0 = Ali[0]#première position possible
    Arretes = L_Coinc(message, crib, k0)#renvoie une liste de couple qui représentent chaque coincidence
    
    G = nx.Graph()
    G.add_edges_from(Arretes)
    
    i=0
    pos = {}
    for Couple in Arretes: 
        pos[Couple] = (i, i+2)
        i += 1
    
    edge_labels = {}   
    for k in range(len(Arretes)):
        couple = Arretes[k]
        edge_labels[couple] = str(k0+k)
            
    G.add_edges_from(Arretes)
    nx.draw_networkx_labels(G, pos, edge_labels)

    https://networkx.github.io/documentation/networkx-1.9.1/reference/generated/networkx.drawing.nx_pylab.draw_networkx_edge_labels.html#networkx.drawing.nx_pylab.draw_networkx_edge_labels



    -
    Edité par irpie 30 janvier 2017 à 20:24:29

    • Partager sur Facebook
    • Partager sur Twitter
      27 février 2024 à 14:31:21

      Hello,

      De mon côté j'utilise la fonction nx.draw_networkx_labels :

      help( nx.draw_networkx_labels )

      >>>Help on function draw_networkx_edge_labels in module networkx.drawing.nx_pylab:

      draw_networkx_edge_labels(G, pos, edge_labels=None, label_pos=0.5, font_size=10, font_color='k', font_family='sans-serif', font_weight='normal', alpha=None, bbox=None, horizontalalignment='center', verticalalignment='center', ax=None, rotate=True, clip_on=True)
          Draw edge labels.

      Parameters
          ----------
          G : graph
              A networkx graph
          
          pos : dictionary
              A dictionary with nodes as keys and positions as values.
              Positions should be sequences of length 2.
          
          edge_labels : dictionary (default={})
              Edge labels in a dictionary of labels keyed by edge two-tuple.
              Only labels for the keys in the dictionary are drawn.

       ...

      Je ne comprenais pas non plus "pos" alors j'ai demandé à notre très cher ami chatGPT de m'expliquer :

      " L'argument pos de la fonction nx.draw_networkx_labels(G, pos, edge_labels) correspond à un dictionnaire où les clés sont les nœuds du graphe G, et les valeurs sont les positions des nœuds dans l'espace. Ce dictionnaire spécifie les coordonnées où les étiquettes des nœuds doivent être dessinées dans le tracé du graphe.

      Typiquement, vous obtenez ce dictionnaire pos en utilisant une des fonctions de disposition de NetworkX comme nx.spring_layout, nx.circular_layout, nx.random_layout, nx.shell_layout, nx.spectral_layout, ou en fournissant vos propres coordonnées personnalisées. Ces fonctions calculent les positions des nœuds dans le plan ou dans l'espace en fonction de l'algorithme de disposition spécifié. Une fois que vous avez calculé ces positions, vous pouvez les utiliser comme entrée pour la fonction nx.draw_networkx_labels() pour placer les étiquettes des nœuds aux positions appropriées dans le tracé du graphe. "

      Voici mon programme ( ça fonctionne ):

      G.add_edges_from(edges) # edges = le tableau des arêtes
      
      labels = nx.get_edge_attributes(G,'weight') #Je construit le tableau des labels à afficher sur les arêtes (ici j'ai besoin de leur poids)
      
      pos=nx.spring_layout(G) # je ne m'embête pas à placer les arêtes à la main
      
      nx.draw(G, pos, with_labels=True) # je dessine le graphe (en affichant le nom des sommets)
      nx.draw_networkx_edge_labels(G,pos,edge_labels=labels) # je dessine les labels des arêtes en utilisant pos et labels
      
      plt.show() # et j'affiche

      Je pense que les 'noms' de tes arêtes ne sont pas leur poids, pense alors à changer 'labels' et y mettre ce que tu veux afficher sur tes arêtes

      nx.draw_networkx_edge_labels manipule beaucoup d'attributs, comme la couleur ou l'épaisseur des arêtes. C'est pratique pour la lisibilité du graph.

      Bonne journée ;-)



      • Partager sur Facebook
      • Partager sur Twitter
        27 février 2024 à 18:41:27

        Bel effort, mais le sujet date de 2017. Donc il y a 7 ans.
        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

        Les graph networkx sur Python

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        • Editeur
        • Markdown