Bords courbes dans NetworkX

Sep 16 2020

J'ai actuellement le code suivant pour mon graphique networkx:

import matplotlib.pyplot as plt
import networkx as nx

G = nx.Graph()

G.add_edge("a", "b", weight=0.6)
G.add_edge("a", "c", weight=0.2)
G.add_edge("c", "d", weight=0.1)
G.add_edge("c", "e", weight=0.7)
G.add_edge("c", "f", weight=0.9)
G.add_edge("a", "d", weight=0.3)

elarge = [(u, v) for (u, v, d) in G.edges(data=True) if d["weight"] > 0.5]
esmall = [(u, v) for (u, v, d) in G.edges(data=True) if d["weight"] <= 0.5]

pos = nx.circular_layout(G)  # positions for all nodes

# nodes
nx.draw_networkx_nodes(G, pos, node_size=700)

# edges
nx.draw_networkx_edges(G, pos, edgelist=elarge, width=6)
nx.draw_networkx_edges(
    G, pos, edgelist=esmall, width=6, alpha=0.5, edge_color="b", style="dashed"
)

# labels
nx.draw_networkx_labels(G, pos, font_size=20, font_family="sans-serif")

plt.axis("off")
plt.show()

Qui a la sortie suivante:

Mais ce que je veux, c'est que les lignes de connexion soient incurvées et non droites. Je n'ai pas trouvé de style de ligne dans matplotlib qui me permette de le faire.

Réponses

3 yatu Sep 16 2020 at 18:02

De la même manière que cette réponse , vous pouvez faire:

plt.figure(figsize=(15,8))

pos = nx.circular_layout(G)  # positions for all nodes

ax = plt.gca()

for edge in G.edges():
    source, target = edge
    rad = 0.2
    c = edge in elarge
    arrowprops=dict(arrowstyle="-", 
                    color='black' if c else 'blue',
                    connectionstyle=f"arc3,rad={rad}",
                    linestyle= '-' if c else '--',
                    alpha=0.6,
                    linewidth=5)
    ax.annotate("",
                xy=pos[source],
                xytext=pos[target],
                arrowprops=arrowprops
               )
# nodes
nx.draw_networkx_nodes(G, pos, node_size=700, node_color='black')
# labels
nx.draw_networkx_labels(G, pos, font_size=20, 
                        font_family="sans-serif", 
                        font_color ='white')

plt.box(False)
plt.show()