.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "_auto_examples/plot_data_analytics.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr__auto_examples_plot_data_analytics.py: Plotting Data ============= In this example, we plot some data obtained from a Tradesman model. .. GENERATED FROM PYTHON SOURCE LINES 9-10 Imports .. GENERATED FROM PYTHON SOURCE LINES 10-24 .. code-block:: default import os os.environ["USE_PYGEOS"] = "0" from uuid import uuid4 from tempfile import gettempdir from aequilibrae.project import Project import folium import contextily as cx import matplotlib.pyplot as plt import geopandas as gpd from zipfile import ZipFile from urllib.request import urlretrieve .. GENERATED FROM PYTHON SOURCE LINES 25-28 Let's download our project data. This data is available as part of the project documentation, and presents La Serena and Coquimbo metropolitan area in Chile. .. GENERATED FROM PYTHON SOURCE LINES 28-39 .. code-block:: default URL = "https://github.com/AequilibraE/tradesman/releases/download/V0.1b/coquimbo.zip" proj_fldr = os.path.join(gettempdir(), uuid4().hex) file_fldr = os.path.join(gettempdir(), "coquimbo.zip") if not os.path.isfile(file_fldr): urlretrieve(URL, file_fldr) ZipFile(file_fldr).extractall(proj_fldr) .. GENERATED FROM PYTHON SOURCE LINES 40-41 Open an AequilibraE project .. GENERATED FROM PYTHON SOURCE LINES 41-44 .. code-block:: default proj = Project() proj.open(proj_fldr) .. GENERATED FROM PYTHON SOURCE LINES 45-46 We establish a connection .. GENERATED FROM PYTHON SOURCE LINES 46-48 .. code-block:: default cnx = proj.conn .. GENERATED FROM PYTHON SOURCE LINES 49-51 Let's identify the region we are plotting our data. First we import our subdivisions .. GENERATED FROM PYTHON SOURCE LINES 51-59 .. code-block:: default subdivisions = gpd.read_postgis( "SELECT division_name, level, ST_AsBinary(geometry)geom FROM political_subdivisions;", con=cnx, geom_col="geom", crs=4326, ) .. GENERATED FROM PYTHON SOURCE LINES 60-62 Now we can plot our map! Go ahead and check it out .. GENERATED FROM PYTHON SOURCE LINES 62-95 .. code-block:: default colors = ["#01BEFE", "#FFDD00", "#FF7D00", "#FF006D", "#ADFF02", "#8F00FF"] m = None for lvl in range(-1, subdivisions.level.max() + 1): gdf = subdivisions[subdivisions.level == lvl] if m: gdf.explore( m=m, name=f"level {lvl}", tiles="CartoDB positron", tooltip=False, popup=True, location=[-29.935717, -71.260520], zoom_start=11, legend=False, color=colors[lvl + 1], ) else: m = gdf.explore( name=f"model_area", tiles="CartoDB positron", tooltip=False, popup=True, location=[-29.935717, -71.260520], zoom_start=11, legend=False, color=colors[lvl + 1], ) folium.LayerControl().add_to(m) m .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 96-97 Feel free to turn on/off all the layers. If you click on the subdivisions, you can also check its name and level. .. GENERATED FROM PYTHON SOURCE LINES 99-100 Now let's move on and import some information about our model's TAZs. .. GENERATED FROM PYTHON SOURCE LINES 100-103 .. code-block:: default zones = gpd.read_postgis("SELECT *, ST_AsBinary(geometry) geom FROM zones;", con=cnx, geom_col="geom", crs=4326) zones.drop(columns=["geometry"], inplace=True) .. GENERATED FROM PYTHON SOURCE LINES 104-106 And create new columns Population per square kilometer .. GENERATED FROM PYTHON SOURCE LINES 106-108 .. code-block:: default zones["POP_DENSITY"] = zones["population"] / (zones["geom"].to_crs(3857).area * 10e-6) .. GENERATED FROM PYTHON SOURCE LINES 109-110 Let's plot our data! .. GENERATED FROM PYTHON SOURCE LINES 110-120 .. code-block:: default zones.explore( "POP_DENSITY", tiles="CartoDB positron", cmap="Greens", tooltip=False, style_kwds={"fillOpacity": 1.0}, zoom_start=11, location=[-29.935717, -71.260520], popup=True, ) .. raw:: html
Make this Notebook Trusted to load map: File -> Trust Notebook


.. GENERATED FROM PYTHON SOURCE LINES 121-122 Total female population per zone .. GENERATED FROM PYTHON SOURCE LINES 122-128 .. code-block:: default zones["TOTALF_POP"] = zones[[f"POPF{i}" for i in range(1, 19)]].sum(axis=1) # Total male population per zone zones["TOTALM_POP"] = zones[[f"POPM{i}" for i in range(1, 19)]].sum(axis=1) # Ratio of the male population with respect to the female population zones["PP_FM"] = zones.TOTALM_POP / zones.TOTALF_POP .. GENERATED FROM PYTHON SOURCE LINES 129-140 .. code-block:: default zones.explore( "PP_FM", tiles="CartoDB positron", cmap="RdPu", tooltip=False, style_kwds={"fillOpacity": 1.0}, zoom_start=11, location=[-29.935717, -71.260520], popup=True, ) .. raw:: html
Make this Notebook Trusted to load map: File -> Trust Notebook


.. GENERATED FROM PYTHON SOURCE LINES 141-142 In an ideal scenario, the ratio of the male population with respect to the female population would be close to 1.06. In countries such as India or China, this ratio is a bit larger, 1.12 and 1.15, respectively. This difference is responsible for creating abnormal sex ratios at birth. .. GENERATED FROM PYTHON SOURCE LINES 144-146 Now, let's analyze the median age of male and female inhabitants per zone. To plot this data, we shall do a little bit of math first, as our data is represented in intervals. .. GENERATED FROM PYTHON SOURCE LINES 146-169 .. code-block:: default interval_min = [0, 1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80] interval_mean = [0.5, 3, 7.5, 12.5, 17.5, 22.5, 27.5, 32.5, 37.5, 42.5, 47.5, 52.5, 57.5, 62.5, 67.5, 72.5, 77.5, 82.5] interval_range = [1, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5] for sex in ["F", "M"]: list_values = zones[[f"POP{sex}{i}" for i in range(1, 19)]].to_numpy() median_values = [] for idx, lst in enumerate(list_values): median = lst.sum() / 2 counter = 0 for pos, element in enumerate(lst): counter += element if counter > median: counter -= element break median_values.append(interval_min[pos - 1] + ((median - counter) * (interval_range[pos - 1] / lst[pos - 1]))) zones[f"MEDIAN_AGE_{sex}"] = median_values .. GENERATED FROM PYTHON SOURCE LINES 170-171 Let's take a look at our data! .. GENERATED FROM PYTHON SOURCE LINES 171-203 .. code-block:: default fig, ax = plt.subplots(1, 2, constrained_layout=True, frameon=False, figsize=(12, 8)) zones.plot( ax=ax[0], column="MEDIAN_AGE_F", linewidth=0.1, edgecolor="black", facecolor="whitesmoke", cmap="Oranges", scheme="equal_interval", k=5, legend=True, legend_kwds={"loc": "upper left", "fmt": "{:.2f}"}, ) cx.add_basemap(ax[0], crs=4326, source=cx.providers.Stamen.TonerLite) zones.plot( ax=ax[1], column="MEDIAN_AGE_M", linewidth=0.1, edgecolor="black", facecolor="whitesmoke", cmap="Blues", legend=True, scheme="equal_interval", k=5, legend_kwds={"loc": "upper left", "fmt": "{:.2f}"}, ) cx.add_basemap(ax[1], crs=4326, source=cx.providers.Stamen.TonerLite) fig.show() .. image-sg:: /_auto_examples/images/sphx_glr_plot_data_analytics_001.png :alt: plot data analytics :srcset: /_auto_examples/images/sphx_glr_plot_data_analytics_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 204-205 Our model also has OpenStreetMaps Building information. Let's take a look at the location of some building types. .. GENERATED FROM PYTHON SOURCE LINES 207-208 Import the data .. GENERATED FROM PYTHON SOURCE LINES 208-212 .. code-block:: default qry = "SELECT building, zone_id, ST_AsBinary(geometry)geom FROM osm_building WHERE geometry IS NOT NULL;" buildings = gpd.read_postgis(qry, con=cnx, geom_col="geom", crs=4326) buildings = buildings[buildings.building.isin(["undetermined", "Religious", "residential", "commercial"])] .. GENERATED FROM PYTHON SOURCE LINES 213-214 And plot it .. GENERATED FROM PYTHON SOURCE LINES 214-249 .. code-block:: default colors = ["#73b7b8", "#0077b6", "#f05a29", "#f05a29"] m = None for idx, bld in enumerate(buildings.building.unique()): gdf = buildings[buildings.building == bld] if m: gdf.explore( m=m, name=bld, tiles="CartoDB positron", tooltip=False, popup=True, zoom_start=15, location=[-29.9541855, -71.3479664], legend=False, color=colors[idx], ) else: m = gdf.explore( name=bld, tiles="CartoDB positron", tooltip=False, popup=True, zoom_start=15, location=[-29.9541855, -71.3479664], legend=False, color=colors[idx], ) folium.LayerControl().add_to(m) m .. raw:: html
Make this Notebook Trusted to load map: File -> Trust Notebook


.. GENERATED FROM PYTHON SOURCE LINES 250-252 Finally, let's check out our model's network. As we imported data from OpenStreetMaps, it is possible that we have several _link_type_ categories. We'll plot only five of them. .. GENERATED FROM PYTHON SOURCE LINES 252-257 .. code-block:: default qry = "SELECT link_type, distance, modes, ST_AsBinary(geometry) geom FROM links;" links = gpd.read_postgis(qry, con=cnx, geom_col="geom", crs=4326) links = links[links.link_type.isin(["motorway", "trunk", "primary", "secondary", "tertiary"])] .. GENERATED FROM PYTHON SOURCE LINES 258-290 .. code-block:: default colors = ["#219EBC", "#ffb703", "#8ECAE6", "#023047", "#fb8500"] m = None for idx, tp in enumerate(links.link_type.unique()): gdf = links[links.link_type == tp] if m: gdf.explore( m=m, name=tp, tiles="CartoDB positron", tooltip=False, popup=True, zoom_start=11, location=[-29.935717, -71.260520], legend=False, color=colors[idx], ) else: m = gdf.explore( name=tp, tiles="CartoDB positron", tooltip=False, popup=True, zoom_start=11, location=[-29.935717, -71.260520], legend=False, color=colors[idx], ) folium.LayerControl().add_to(m) m .. raw:: html
Make this Notebook Trusted to load map: File -> Trust Notebook


.. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 25.113 seconds) .. _sphx_glr_download__auto_examples_plot_data_analytics.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_data_analytics.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_data_analytics.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_