Ben Jones
Ben Jones

Reputation: 957

Matplotlib complains about shape of networkx adjacency matrix

The following code results in an error unpacking the shape of my matrix in figaspect, but the shape seems to be correct (a 4 by 4 2D array). Am I doing something dumb?

import networkx as nx
import matplotlib.pyplot as plt
g = nx.Graph()
g.add_edge(1, 2)
g.add_edge(2, 3)
g.add_edge(3, 4)
matrix = nx.to_scipy_sparse_matrix(g)
print(matrix.shape)
plt.matshow(matrix)
plt.show()

errors with:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-118-70cfbe8cdb62> in <module>
      7 matrix = nx.to_scipy_sparse_matrix(g)
      8 print(matrix.shape)
----> 9 plt.matshow(matrix)
     10 plt.show()

/usr/local/lib/python3.7/site-packages/matplotlib/pyplot.py in matshow(A, fignum, **kwargs)
   2180         # Extract actual aspect ratio of array and make appropriately sized
   2181         # figure.
-> 2182         fig = figure(fignum, figsize=figaspect(A))
   2183         ax = fig.add_axes([0.15, 0.09, 0.775, 0.775])
   2184     im = ax.matshow(A, **kwargs)

/usr/local/lib/python3.7/site-packages/matplotlib/figure.py in figaspect(arg)
   2740     # Extract the aspect ratio of the array
   2741     if isarray:
-> 2742         nr, nc = arg.shape[:2]
   2743         arr_ratio = nr / nc
   2744     else:

ValueError: not enough values to unpack (expected 2, got 0)

but the printed shape is (4, 4)

Upvotes: 0

Views: 262

Answers (1)

Scott Boston
Scott Boston

Reputation: 153550

Try using todense:

plt.matshow(matrix.todense())

Where,

print(matrix)

Outputs:

  (0, 1)    1
  (1, 0)    1
  (1, 2)    1
  (2, 1)    1
  (2, 3)    1
  (3, 2)    1

And,

print(matrix.todense())

Outputs:

[[0 1 0 0]
 [1 0 1 0]
 [0 1 0 1]
 [0 0 1 0]]

Plottting:

enter image description here

Upvotes: 1

Related Questions