2016-07-22 16 views
3

Ich habe ein Diagramm eines Netzwerkdiagramms, in dem die Kantenfarbe von den den jeweiligen Kanten zugewiesenen Gewichten abhängt (mit a_netw dem nx.Graph):Legende zum Netzwerkdiagramm hinzufügen, um die Färbung der Knoten zu erklären

a_netw_edges = a_netw.edges() 
a_netw_weights = [a_netw[source][dest]['weight'] for source, dest in a_netw_edges] 
a_netw_colors = [plt.cm.Blues(weight*15) for weight in a_netw_weights] 
nx.draw_networkx(a_netw, edges=a_netw_edges, width=1, edge_color=a_netw_colors) 

Zu diesem Graph möchte ich eine Legende hinzufügen, die die Verbindung zwischen den Gewichten und den Farben explizit macht; wie in einer Heatmap, die pcolor verwendet.

Während ich eine ungefähre Vorstellung davon, wie müssen anfangen:

fig, axes = plt.subplots(nrows=2) 
nx.draw_networkx(a_netw, edges=a_netw_edges, width=1, edge_color=a_netw_colors, ax=axes[0]) 
axes[0].get_xaxis().set_visible(False) 
axes[0].get_yaxis().set_visible(False) 
gradient = np.linspace(0, 1, 256) 
gradient = np.vstack((gradient, gradient)) 
axes[1].imshow(gradient, aspect=3, cmap=plt.cm.Blues) 
axes[1].get_yaxis().set_visible(False) 
plt.tight_layout() 

Ich habe keine Ahnung, wie die folgenden Schritte zu tun:

  1. die richtigen Zecken auf der entsprechenden Achse hinzufügen die bekommen Verbindung mit den Gewichten.
  2. Zeichnen Sie es vertikal statt horizontal.
+0

bitte alle relevanten Import-Anweisungen an die Spitze des Codes und bieten beispielsweise Daten, möglicherweise in Form eines minimalen Beispiel Netzwerk hinzufügen, die ausreichend ist, neu zu erstellen, was Sie zu tun versuchen. – jlarsch

Antwort

2

Ich schlage vor, dass Sie den Befehl colorbar() wie unten gezeigt verwenden. Ich stelle ein Beispieldiagramm zur Verfügung, ob es Sinn macht?

enter image description here

import networkx as nx 
import matplotlib.pyplot as plt 

#generate a graph with weights 
a_netw=nx.Graph() 
a_netw.add_edge('a','b',weight=6) 
a_netw.add_edge('a','c',weight=2) 
a_netw.add_edge('c','d',weight=1) 
a_netw.add_edge('c','e',weight=7) 
a_netw.add_edge('c','f',weight=9) 
a_netw.add_edge('a','d',weight=3) 

#creating a color list for each edge based on weight 

a_netw_edges = a_netw.edges() 
a_netw_weights = [a_netw[source][dest]['weight'] for source, dest in a_netw_edges] 

#scale weights in range 0-1 before assigning color 
maxWeight=float(max(a_netw_weights)) 
a_netw_colors = [plt.cm.Blues(weight/maxWeight) for weight in a_netw_weights] 


#suppress plotting for the following dummy heatmap 
plt.ioff() 

#multiply all tuples in color list by scale factor 
colors_unscaled=[tuple(map(lambda x: maxWeight*x, y)) for y in a_netw_colors] 
#generate a 'dummy' heatmap using the edgeColors as substrate for colormap 
heatmap = plt.pcolor(colors_unscaled,cmap=plt.cm.Blues) 

#re-enable plotting 
plt.ion() 

fig,axes = plt.subplots() 
nx.draw_networkx(a_netw, edges=a_netw_edges, width=10, edge_color=a_netw_colors, ax=axes) 
axes.get_xaxis().set_visible(False) 
axes.get_yaxis().set_visible(False) 

#add colorbar 
cbar = plt.colorbar(heatmap) 
cbar.ax.set_ylabel('edge weight',labelpad=15,rotation=270)