Skip to content

mpl_draw() does not work for multigraphs #774

@DionTimmermann

Description

@DionTimmermann

Information

  • rustworkx version: 0.12.1
  • Python version: 3.9
  • Rust version: I do not know, but not relevant for this issue.
  • Operating system: macOs

What is the current behavior?

When plotting a multigraph with parallel edges using rustworkx.visualization.mpl_draw(), two issues occur:

  1. The arrows for multiple edges are printed on top of each other.
  2. Only one label is drawn for every pair of nodes. (The labels are currently saved in a dict, which uses node pair as the key.)

What is the expected behavior?

I see three possible solutions:

  • The documentation could warn that mpl_draw() does not work for multigraphs.
  • mpl_draw() could raise a warning when a multigraph is passed. (networkx seems to do that for at least the edge labels)
  • Ideally, mpl_draw() would be modified to show parallel edges. As far as I can see, this would include three steps, similar to what has been outlined in https://stackoverflow.com/a/70245742:
    1. Modifying draw_edges() so it bends the arrows of parallel edges to prevent overlap.
    2. Modifying draw_edge_labels() so it plots the edge labels at the positions of the arrows and not simply on the line connecting the nodes.
    3. Modifying draw_graph() so kwds["edge_labels"] contains one entry per edge and not one per node-pair. (The key of the dict should be the edge id and not the node pair.)

Steps to reproduce the problem

  1. Create a graph with two parallel edges:
graph = rustworkx.PyDiGraph()
graph.add_node('A')
graph.add_node('B')
graph.add_edge(0, 1, 1)
graph.add_edge(0, 1, 2)
mpl_draw(graph, with_labels=True, labels=str, edge_labels=str, alpha=0.5)
  1. Save the image as a vector graphic and inspect it.

The image will contain two arrows on top of each other and the label for edge 2. The label for edge 1 is not drawn.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions