plot_dedensification.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. """
  2. ===============
  3. Dedensification
  4. ===============
  5. Examples of dedensification of a graph. Dedensification retains the structural
  6. pattern of the original graph and will only add compressor nodes when doing so
  7. would result in fewer edges in the compressed graph.
  8. """
  9. import matplotlib.pyplot as plt
  10. import networkx as nx
  11. plt.suptitle("Dedensification")
  12. original_graph = nx.DiGraph()
  13. white_nodes = ["1", "2", "3", "4", "5", "6"]
  14. red_nodes = ["A", "B", "C"]
  15. node_sizes = [250 for node in white_nodes + red_nodes]
  16. node_colors = ["white" for n in white_nodes] + ["red" for n in red_nodes]
  17. original_graph.add_nodes_from(white_nodes + red_nodes)
  18. original_graph.add_edges_from(
  19. [
  20. ("1", "C"),
  21. ("1", "B"),
  22. ("2", "C"),
  23. ("2", "B"),
  24. ("2", "A"),
  25. ("3", "B"),
  26. ("3", "A"),
  27. ("3", "6"),
  28. ("4", "C"),
  29. ("4", "B"),
  30. ("4", "A"),
  31. ("5", "B"),
  32. ("5", "A"),
  33. ("6", "5"),
  34. ("A", "6"),
  35. ]
  36. )
  37. base_options = {"with_labels": True, "edgecolors": "black"}
  38. pos = {
  39. "3": (0, 1),
  40. "2": (0, 2),
  41. "1": (0, 3),
  42. "6": (1, 0),
  43. "A": (1, 1),
  44. "B": (1, 2),
  45. "C": (1, 3),
  46. "4": (2, 3),
  47. "5": (2, 1),
  48. }
  49. ax1 = plt.subplot(1, 2, 1)
  50. plt.title("Original (%s edges)" % original_graph.number_of_edges())
  51. nx.draw_networkx(original_graph, pos=pos, node_color=node_colors, **base_options)
  52. nonexp_graph, compression_nodes = nx.summarization.dedensify(
  53. original_graph, threshold=2, copy=False
  54. )
  55. nonexp_node_colors = list(node_colors)
  56. nonexp_node_sizes = list(node_sizes)
  57. for node in compression_nodes:
  58. nonexp_node_colors.append("yellow")
  59. nonexp_node_sizes.append(600)
  60. plt.subplot(1, 2, 2)
  61. plt.title("Dedensified (%s edges)" % nonexp_graph.number_of_edges())
  62. nonexp_pos = {
  63. "5": (0, 0),
  64. "B": (0, 2),
  65. "1": (0, 3),
  66. "6": (1, 0.75),
  67. "3": (1.5, 1.5),
  68. "A": (2, 0),
  69. "C": (2, 3),
  70. "4": (3, 1.5),
  71. "2": (3, 2.5),
  72. }
  73. c_nodes = list(compression_nodes)
  74. c_nodes.sort()
  75. for spot, node in enumerate(c_nodes):
  76. nonexp_pos[node] = (2, spot + 2)
  77. nx.draw_networkx(
  78. nonexp_graph,
  79. pos=nonexp_pos,
  80. node_color=nonexp_node_colors,
  81. node_size=nonexp_node_sizes,
  82. **base_options,
  83. )
  84. plt.tight_layout()
  85. plt.show()