| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- """
- ==================
- SNAP Graph Summary
- ==================
- An example of summarizing a graph based on node attributes and edge attributes
- using the Summarization by Grouping Nodes on Attributes and Pairwise
- edges (SNAP) algorithm (not to be confused with the Stanford Network
- Analysis Project). The algorithm groups nodes by their unique
- combinations of node attribute values and edge types with other groups
- of nodes to produce a summary graph. The summary graph can then be used to
- infer how nodes with different attributes values relate to other nodes in the
- graph.
- """
- import networkx as nx
- import matplotlib.pyplot as plt
- nodes = {
- "A": {"color": "Red"},
- "B": {"color": "Red"},
- "C": {"color": "Red"},
- "D": {"color": "Red"},
- "E": {"color": "Blue"},
- "F": {"color": "Blue"},
- "G": {"color": "Blue"},
- "H": {"color": "Blue"},
- "I": {"color": "Yellow"},
- "J": {"color": "Yellow"},
- "K": {"color": "Yellow"},
- "L": {"color": "Yellow"},
- }
- edges = [
- ("A", "B", "Strong"),
- ("A", "C", "Weak"),
- ("A", "E", "Strong"),
- ("A", "I", "Weak"),
- ("B", "D", "Weak"),
- ("B", "J", "Weak"),
- ("B", "F", "Strong"),
- ("C", "G", "Weak"),
- ("D", "H", "Weak"),
- ("I", "J", "Strong"),
- ("J", "K", "Strong"),
- ("I", "L", "Strong"),
- ]
- original_graph = nx.Graph()
- original_graph.add_nodes_from(n for n in nodes.items())
- original_graph.add_edges_from((u, v, {"type": label}) for u, v, label in edges)
- plt.suptitle("SNAP Summarization")
- base_options = {"with_labels": True, "edgecolors": "black", "node_size": 500}
- ax1 = plt.subplot(1, 2, 1)
- plt.title(
- "Original (%s nodes, %s edges)"
- % (original_graph.number_of_nodes(), original_graph.number_of_edges())
- )
- pos = nx.spring_layout(original_graph, seed=7482934)
- node_colors = [d["color"] for _, d in original_graph.nodes(data=True)]
- edge_type_visual_weight_lookup = {"Weak": 1.0, "Strong": 3.0}
- edge_weights = [
- edge_type_visual_weight_lookup[d["type"]]
- for _, _, d in original_graph.edges(data=True)
- ]
- nx.draw_networkx(
- original_graph, pos=pos, node_color=node_colors, width=edge_weights, **base_options
- )
- node_attributes = ("color",)
- edge_attributes = ("type",)
- summary_graph = nx.snap_aggregation(
- original_graph, node_attributes, edge_attributes, prefix="S-"
- )
- plt.subplot(1, 2, 2)
- plt.title(
- "SNAP Aggregation (%s nodes, %s edges)"
- % (summary_graph.number_of_nodes(), summary_graph.number_of_edges())
- )
- summary_pos = nx.spring_layout(summary_graph, seed=8375428)
- node_colors = []
- for node in summary_graph:
- color = summary_graph.nodes[node]["color"]
- node_colors.append(color)
- edge_weights = []
- for edge in summary_graph.edges():
- edge_types = summary_graph.get_edge_data(*edge)["types"]
- edge_weight = 0.0
- for edge_type in edge_types:
- edge_weight += edge_type_visual_weight_lookup[edge_type["type"]]
- edge_weights.append(edge_weight)
- nx.draw_networkx(
- summary_graph,
- pos=summary_pos,
- node_color=node_colors,
- width=edge_weights,
- **base_options,
- )
- plt.tight_layout()
- plt.show()
|