gboeing / osmnx

OSMnx is a Python package to easily download, model, analyze, and visualize street networks and other geospatial features from OpenStreetMap.
https://osmnx.readthedocs.io
MIT License
4.74k stars 813 forks source link

Graph route animations #1187

Open nkleinbaer opened 6 days ago

nkleinbaer commented 6 days ago

Contributing guidelines

Documentation

Existing issues

What problem does your feature proposal solve?

Allow users to create animated plots of routes on graphs. For routes that cover all or most edges of a graph, a static plot doesn't show the route very clearly.

What is your proposed solution?

Use matplotlib.animations.FuncAnimation to animate route(s) step-by-step. Either:

  1. Add a new osmnx.plot.animate_graph_route function for this feature
  2. Add animate: bool argument to the existing osmnx.plot.plot_graph_route function

What alternatives have you considered?

Of course users can implement this themselves outside of osmnx, not sure if this passes the "not trivially easy" criteria from contributing guidelines.

Additional context

I've been using osmnx for a toy project looking at the route inspection problem. Huge thanks for this awesome project, made it easy for me to get started playing with the actual problem quickly instead of writing code to fetch road data and convert it into graphs. For my use case I found that plotting the entire route at once isn't particularly insightful -- my routes always cover the entire graph -- so I implemented animation for myself. Figured it may be useful to others and worth contributing back.

I've technically made a liar of myself by checking the "Nothing similar appears in an existing issue" box. I see two old, closed issues mentioning animation:

In #226 the animation piece is only mentioned tangentially, in #109 a user asks for help doing this but doesn't explicitly propose/request a feature.

Can post a brief code snippet with minimal example a bit later today.

gboeing commented 4 days ago

Thanks for using OSMnx and suggesting this.

Can post a brief code snippet with minimal example a bit later today.

Sure, would you post the proposed code and I'll take a look?

Of course users can implement this themselves outside of osmnx, not sure if this passes the "not trivially easy" criteria from contributing guidelines.

It's really just a matter of the complexity of the proposed code. Sometimes it's just easier to share a dozen lines of code here in a comment or on StackOverflow for others to reuse than it is to incorporate it into the package, depending on the general applicability of the use case.

nkleinbaer commented 4 days ago

Here is a minimal example, taking the route of adding on to the existing plot_graph_route func.

I found it convenient to define update_lines as an inner function so that it could just modify the lines variable defined in the outer scope, but alternatively this could be passed using the functools.partial or by passing fargs to matplotlib.animation.FuncAnimation (although the docs say the later is discouraged).

To make it a bit snazzier I've also played around with:

  1. Increasing the alpha on all but the leading line segment so that the "trail" left by the route appears faded out. This makes it easier to view routes that double-back on themselves
  2. Advancing one full graph edge at a time (currently just goes vertex-by-vertex)
  3. Or, alternatively, interpolating additional vertices along the route to make it look smoother