import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
import warnings
from trackintel.geogr.distances import meters_to_decimal_degrees
from trackintel.visualization.osm import plot_osm_streets
from trackintel.visualization.util import regular_figure, save_fig
from trackintel.geogr.distances import check_gdf_planar
[docs]def plot_staypoints(staypoints, out_filename=None, radius=100, positionfixes=None, plot_osm=False, axis=None):
"""Plot staypoints (optionally to a file).
You can specify the radius with which each staypoint should be drawn, as well as
if underlying positionfixes and OSM streets should be drawn. The data gets transformed
to wgs84 for the plotting.
Parameters
----------
staypoints : GeoDataFrame (as trackintel staypoints)
The staypoints to plot.
out_filename : str, optional
The file to plot to, if this is not set, the plot will simply be shown.
radius : float, default 100 (meter)
The radius in meter with which circles around staypoints should be drawn.
positionfixes : GeoDataFrame (as trackintel positionfixes), optional
If available, some positionfixes that can additionally be plotted.
plot_osm : bool, default False
If this is set to True, it will download an OSM street network and plot
below the staypoints.
axis : matplotlib.pyplot.Artist, optional
axis on which to draw the plot
Examples
--------
>>> sp.as_staypoints.plot('output.png', radius=100, positionfixes=pfs, plot_osm=True)
"""
if axis is None:
_, ax = regular_figure()
else:
ax = axis
name_geocol = staypoints.geometry.name
_, staypoints = check_gdf_planar(staypoints, transform=True)
if positionfixes is not None:
positionfixes.as_positionfixes.plot(plot_osm=plot_osm, axis=ax)
else:
west = staypoints.geometry.x.min() - 0.03
east = staypoints.geometry.x.max() + 0.03
north = staypoints.geometry.y.max() + 0.03
south = staypoints.geometry.y.min() - 0.03
if plot_osm:
plot_osm_streets(north, south, east, west, ax)
ax.set_xlim([west, east])
ax.set_ylim([south, north])
center_latitude = (ax.get_ylim()[0] + ax.get_ylim()[1]) / 2
radius = meters_to_decimal_degrees(radius, center_latitude)
for pt in staypoints.to_dict("records"):
circle = mpatches.Circle(
(pt[name_geocol].x, pt[name_geocol].y), radius, facecolor="none", edgecolor="g", zorder=3
)
ax.add_artist(circle)
ax.set_aspect("equal", adjustable="box")
if out_filename is not None:
save_fig(out_filename, formats=["png"])
elif axis is None:
plt.show()