{"id":13426964,"url":"https://github.com/marceloprates/prettymaps","last_synced_at":"2025-05-13T17:03:23.969Z","repository":{"id":37409070,"uuid":"344802603","full_name":"marceloprates/prettymaps","owner":"marceloprates","description":"Draw pretty maps from OpenStreetMap data! Built with osmnx +matplotlib + shapely","archived":false,"fork":false,"pushed_at":"2025-03-04T14:59:10.000Z","size":267545,"stargazers_count":11622,"open_issues_count":54,"forks_count":549,"subscribers_count":78,"default_branch":"main","last_synced_at":"2025-05-06T16:12:24.768Z","etag":null,"topics":["cartography","generative-art","jupyter-notebook","maps","matplotlib","openstreetmap","python"],"latest_commit_sha":null,"homepage":"https://prettymaps.streamlit.app/","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/marceloprates.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":"marceloprates_","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2021-03-05T12:22:05.000Z","updated_at":"2025-05-06T09:34:49.000Z","dependencies_parsed_at":"2023-02-09T13:46:00.791Z","dependency_job_id":"67c4375e-b654-4328-acba-786d744ccfca","html_url":"https://github.com/marceloprates/prettymaps","commit_stats":{"total_commits":153,"total_committers":16,"mean_commits":9.5625,"dds":0.2222222222222222,"last_synced_commit":"dc90176911035d8e35a0c1e050d7cf87047358e8"},"previous_names":[],"tags_count":25,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marceloprates%2Fprettymaps","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marceloprates%2Fprettymaps/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marceloprates%2Fprettymaps/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marceloprates%2Fprettymaps/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marceloprates","download_url":"https://codeload.github.com/marceloprates/prettymaps/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253990449,"owners_count":21995773,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cartography","generative-art","jupyter-notebook","maps","matplotlib","openstreetmap","python"],"created_at":"2024-07-31T00:01:49.573Z","updated_at":"2025-05-13T17:03:18.945Z","avatar_url":"https://github.com/marceloprates.png","language":"Jupyter Notebook","readme":"# prettymaps\n\nA minimal Python library to draw customized maps from [OpenStreetMap](https://www.openstreetmap.org/#map=12/11.0733/106.3078) created using the [osmnx](https://github.com/gboeing/osmnx), [matplotlib](https://matplotlib.org/), [shapely](https://shapely.readthedocs.io/en/stable/index.html) and [vsketch](https://github.com/abey79/vsketch) packages.\n\n# Prettymaps is now available as a streamlit app!\n\n[![Streamlit App](https://img.shields.io/badge/Streamlit-Live-blue?logo=streamlit)](https://prettymaps.streamlit.app/)\n\n[![image](https://github.com/user-attachments/assets/14e56496-9eab-4b31-ad05-6227d56cfbd2)](https://prettymaps.streamlit.app/)\n\n\u003c!--![](https://github.com/marceloprates/prettymaps/raw/main/prints/heerhugowaard.png)--\u003e\n\nThis work is [licensed](LICENSE) under a GNU Affero General Public License v3.0 (you can make commercial use, distribute and modify this project, but must **disclose** the source code with the license and copyright notice)\n\n## Note about crediting and NFTs:\n- Please keep the printed message on the figures crediting my repository and OpenStreetMap ([mandatory by their license](https://www.openstreetmap.org/copyright)).\n- I am personally **against** NFTs for their [environmental impact](https://earth.org/nfts-environmental-impact/), the fact that they're a [giant money-laundering pyramid scheme](https://twitter.com/smdiehl/status/1445795667826208770) and the structural incentives they create for [theft](https://twitter.com/NFTtheft) in the open source and generative art communities.\n- **I do not authorize in any way this project to be used for selling NFTs**, although I cannot legally enforce it. **Respect the creator**.\n- The [AeternaCivitas](https://magiceden.io/marketplace/aeterna_civitas) and [geoartnft](https://www.geo-nft.com/) projects have used this work to sell NFTs and refused to credit it. See how they reacted after being exposed: [AeternaCivitas](etc/NFT_theft_AeternaCivitas.jpg), [geoartnft](etc/NFT_theft_geoart.jpg).\n- **I have closed my other generative art projects on Github and won't be sharing new ones as open source to protect me from the NFT community**.\n\n\u003ca href='https://ko-fi.com/marceloprates_' target='_blank'\u003e\u003cimg height='36' style='border:0px;height:36px;' src='https://cdn.ko-fi.com/cdn/kofi1.png?v=3' border='0' alt='Buy Me a Coffee at ko-fi.com' /\u003e\u003c/a\u003e\n\n## As seen on [Hacker News](https://web.archive.org/web/20210825160918/https://news.ycombinator.com/news):\n![](https://github.com/marceloprates/prettymaps/raw/main/prints/hackernews-prettymaps.png)\n\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=marceloprates/prettymaps\u0026type=Date\u0026theme=dark\" /\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=marceloprates/prettymaps\u0026type=Date\" /\u003e\n  \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=star-history/star-history\u0026type=Date\" /\u003e\n\u003c/picture\u003e\n\n## [prettymaps subreddit](https://www.reddit.com/r/prettymaps_/)\n## [Google Colaboratory Demo](https://colab.research.google.com/github/marceloprates/prettymaps/blob/master/notebooks/examples.ipynb)\n\n# Installation\n\n### Install locally:\nInstall prettymaps with:\n\n```\npip install prettymaps\n```\n\n### Install on Google Colaboratory:\n\nInstall prettymaps with:\n\n```\n!pip install -e \"git+https://github.com/marceloprates/prettymaps#egg=prettymaps\"\n```\n\nThen **restart the runtime** (Runtime -\u003e Restart Runtime) before importing prettymaps\n\n# Run front-end\n\nAfter prettymaps is installed, you can run the front-end (streamlit) application from the prettymaps repository using:\n```\nstreamlit run app.py\n```\n\n# Tutorial\n\nPlotting with prettymaps is very simple. Run:\n```python\nprettymaps.plot(your_query)\n```\n\n**your_query** can be:\n1. An address (Example: \"Porto Alegre\"),\n2. Latitude / Longitude coordinates (Example: (-30.0324999, -51.2303767))\n3. A custom boundary in GeoDataFrame format\n\n\n```python\n%reload_ext autoreload\n%autoreload 2\n\nimport prettymaps\n\nplot = prettymaps.plot('Stad van de Zon, Heerhugowaard, Netherlands')\n```\n\n\n    \n![png](README_files/README_7_0.png)\n    \n\n\nYou can also choose from different \"presets\" (parameter combinations saved in JSON files)\n\nSee below an example using the \"minimal\" preset\n\n\n```python\nimport prettymaps\n\nplot = prettymaps.plot(\n    'Stad van de Zon, Heerhugowaard, Netherlands',\n    preset = 'minimal'\n)\n```\n\n\n    \n![png](README_files/README_9_0.png)\n    \n\n\nRun\n\n```python\nprettymaps.presets()\n```\n\nto list all available presets:\n\n\n```python\nimport prettymaps\n\nprettymaps.presets()\n```\n\n\n\n\n\u003cdiv\u003e\n\u003cstyle scoped\u003e\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n\u003c/style\u003e\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003epreset\u003c/th\u003e\n      \u003cth\u003eparams\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003eabraca-redencao\u003c/td\u003e\n      \u003ctd\u003e{'layers': {'perimeter': {}, 'streets': {'widt...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003ebarcelona\u003c/td\u003e\n      \u003ctd\u003e{'layers': {'perimeter': {'circle': False}, 's...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003ebarcelona-plotter\u003c/td\u003e\n      \u003ctd\u003e{'layers': {'streets': {'width': {'primary': 5...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003ecb-bf-f\u003c/td\u003e\n      \u003ctd\u003e{'layers': {'streets': {'width': {'trunk': 6, ...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003edefault\u003c/td\u003e\n      \u003ctd\u003e{'layers': {'perimeter': {}, 'streets': {'widt...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e5\u003c/th\u003e\n      \u003ctd\u003eheerhugowaard\u003c/td\u003e\n      \u003ctd\u003e{'layers': {'perimeter': {}, 'streets': {'widt...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e6\u003c/th\u003e\n      \u003ctd\u003emacao\u003c/td\u003e\n      \u003ctd\u003e{'layers': {'perimeter': {}, 'streets': {'cust...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e7\u003c/th\u003e\n      \u003ctd\u003eminimal\u003c/td\u003e\n      \u003ctd\u003e{'layers': {'perimeter': {}, 'streets': {'widt...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e8\u003c/th\u003e\n      \u003ctd\u003emy-preset\u003c/td\u003e\n      \u003ctd\u003e{'layers': {'building': {'tags': {'building': ...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e9\u003c/th\u003e\n      \u003ctd\u003eplotter\u003c/td\u003e\n      \u003ctd\u003e{'layers': {'perimeter': {}, 'streets': {'widt...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e10\u003c/th\u003e\n      \u003ctd\u003etijuca\u003c/td\u003e\n      \u003ctd\u003e{'layers': {'perimeter': {}, 'streets': {'widt...\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/div\u003e\n\n\n\nTo examine a specific preset, run:\n\n\n```python\nimport prettymaps\n\nprettymaps.preset('default')\n```\n\n\n\n\n    Preset(params={'layers': {'perimeter': {}, 'streets': {'width': {'motorway': 5, 'trunk': 5, 'primary': 4.5, 'secondary': 4, 'tertiary': 3.5, 'cycleway': 3.5, 'residential': 3, 'service': 2, 'unclassified': 2, 'pedestrian': 2, 'footway': 1}}, 'waterway': {'tags': {'waterway': ['river', 'stream']}, 'width': {'river': 20, 'stream': 10}}, 'building': {'tags': {'building': True, 'landuse': 'construction'}}, 'water': {'tags': {'natural': ['water', 'bay']}}, 'sea': {}, 'forest': {'tags': {'landuse': 'forest'}}, 'green': {'tags': {'landuse': ['grass', 'orchard'], 'natural': ['island', 'wood', 'wetland'], 'leisure': 'park'}}, 'rock': {'tags': {'natural': 'bare_rock'}}, 'beach': {'tags': {'natural': 'beach'}}, 'parking': {'tags': {'amenity': 'parking', 'highway': 'pedestrian', 'man_made': 'pier'}}}, 'style': {'perimeter': {'fill': False, 'lw': 0, 'zorder': 0}, 'background': {'fc': '#F2F4CB', 'zorder': -1}, 'green': {'fc': '#8BB174', 'ec': '#2F3737', 'hatch_c': '#A7C497', 'hatch': 'ooo...', 'lw': 1, 'zorder': 1}, 'forest': {'fc': '#64B96A', 'ec': '#2F3737', 'lw': 1, 'zorder': 2}, 'water': {'fc': '#a8e1e6', 'ec': '#2F3737', 'hatch_c': '#9bc3d4', 'hatch': 'ooo...', 'lw': 1, 'zorder': 99}, 'sea': {'fc': '#a8e1e6', 'ec': '#2F3737', 'hatch_c': '#9bc3d4', 'hatch': 'ooo...', 'lw': 1, 'zorder': 99}, 'waterway': {'fc': '#a8e1e6', 'ec': '#2F3737', 'hatch_c': '#9bc3d4', 'hatch': 'ooo...', 'lw': 1, 'zorder': 200}, 'beach': {'fc': '#FCE19C', 'ec': '#2F3737', 'hatch_c': '#d4d196', 'hatch': 'ooo...', 'lw': 1, 'zorder': 3}, 'parking': {'fc': '#F2F4CB', 'ec': '#2F3737', 'lw': 1, 'zorder': 3}, 'streets': {'fc': '#2F3737', 'ec': '#475657', 'alpha': 1, 'lw': 0, 'zorder': 4}, 'building': {'palette': ['#433633', '#FF5E5B'], 'ec': '#2F3737', 'lw': 0.5, 'zorder': 5}, 'rock': {'fc': '#BDC0BA', 'ec': '#2F3737', 'lw': 1, 'zorder': 6}}, 'circle': None, 'radius': 500})\n\n\n\n\nInsted of using the default configuration you can customize several parameters. The most important are:\n\n- layers: A dictionary of OpenStreetMap layers to fetch.\n    - Keys: layer names (arbitrary)\n    - Values: dicts representing OpenStreetMap queries\n- style: Matplotlib style parameters\n    - Keys: layer names (the same as before)\n    - Values: dicts representing Matplotlib style parameters\n\n```python\nplot = prettymaps.plot(\n    # Your query. Example: \"Porto Alegre\" or (-30.0324999, -51.2303767) (GPS coords)\n    your_query,\n    # Dict of OpenStreetMap Layers to plot. Example:\n    # {'building': {'tags': {'building': True}}, 'water': {'tags': {'natural': 'water'}}}\n    # Check the /presets folder for more examples\n    layers,\n    # Dict of style parameters for matplotlib. Example:\n    # {'building': {'palette': ['#f00','#0f0','#00f'], 'edge_color': '#333'}}\n    style,\n    # Preset to load. Options include:\n    # ['default', 'minimal', 'macao', 'tijuca']\n    preset,\n    # Save current parameters to a preset file.\n    # Example: \"my-preset\" will save to \"presets/my-preset.json\"\n    save_preset,\n    # Whether to update loaded preset with additional provided parameters. Boolean\n    update_preset,\n    # Plot with circular boundary. Boolean\n    circle,\n    # Plot area radius. Float\n    radius,\n    # Dilate the boundary by this amount. Float\n    dilate\n)\n```\n\n**plot** is a python dataclass containing:\n\n```python\n@dataclass\nclass Plot:\n    # A dictionary of GeoDataFrames (one for each plot layer)\n    geodataframes: Dict[str, gp.GeoDataFrame]\n    # A matplotlib figure\n    fig: matplotlib.figure.Figure\n    # A matplotlib axis object\n    ax: matplotlib.axes.Axes\n```\n\nHere's an example of running prettymaps.plot() with customized parameters:\n\n\n```python\nimport prettymaps\n\nplot = prettymaps.plot(\n    'Praça Ferreira do Amaral, Macau',\n    circle = True,\n    radius = 1100,\n    layers = {\n        \"green\": {\n            \"tags\": {\n                \"landuse\": \"grass\",\n                \"natural\": [\"island\", \"wood\"],\n                \"leisure\": \"park\"\n            }\n        },\n        \"forest\": {\n            \"tags\": {\n                \"landuse\": \"forest\"\n            }\n        },\n        \"water\": {\n            \"tags\": {\n                \"natural\": [\"water\", \"bay\"]\n            }\n        },\n        \"parking\": {\n            \"tags\": {\n                \"amenity\": \"parking\",\n                \"highway\": \"pedestrian\",\n                \"man_made\": \"pier\"\n            }\n        },\n        \"streets\": {\n            \"width\": {\n                \"motorway\": 5,\n                \"trunk\": 5,\n                \"primary\": 4.5,\n                \"secondary\": 4,\n                \"tertiary\": 3.5,\n                \"residential\": 3,\n            }\n        },\n        \"building\": {\n            \"tags\": {\"building\": True},\n        },\n    },\n    style = {\n        \"background\": {\n            \"fc\": \"#F2F4CB\",\n            \"ec\": \"#dadbc1\",\n            \"hatch\": \"ooo...\",\n        },\n        \"perimeter\": {\n            \"fc\": \"#F2F4CB\",\n            \"ec\": \"#dadbc1\",\n            \"lw\": 0,\n            \"hatch\": \"ooo...\",\n        },\n        \"green\": {\n            \"fc\": \"#D0F1BF\",\n            \"ec\": \"#2F3737\",\n            \"lw\": 1,\n        },\n        \"forest\": {\n            \"fc\": \"#64B96A\",\n            \"ec\": \"#2F3737\",\n            \"lw\": 1,\n        },\n        \"water\": {\n            \"fc\": \"#a1e3ff\",\n            \"ec\": \"#2F3737\",\n            \"hatch\": \"ooo...\",\n            \"hatch_c\": \"#85c9e6\",\n            \"lw\": 1,\n        },\n        \"parking\": {\n            \"fc\": \"#F2F4CB\",\n            \"ec\": \"#2F3737\",\n            \"lw\": 1,\n        },\n        \"streets\": {\n            \"fc\": \"#2F3737\",\n            \"ec\": \"#475657\",\n            \"alpha\": 1,\n            \"lw\": 0,\n        },\n        \"building\": {\n            \"palette\": [\n                \"#FFC857\",\n                \"#E9724C\",\n                \"#C5283D\"\n            ],\n            \"ec\": \"#2F3737\",\n            \"lw\": 0.5,\n        }\n    }\n)\n```\n\n\n    \n![png](README_files/README_15_0.png)\n    \n\n\nIn order to plot an entire region and not just a rectangular or circular area, set\n\n```python\nradius = False\n```\n\n\n```python\nimport prettymaps\n\nplot = prettymaps.plot(\n    'Bom Fim, Porto Alegre, Brasil', radius = False,\n)\n```\n\n\n    \n![png](README_files/README_17_0.png)\n    \n\n\nYou can access layers's GeoDataFrames directly like this:\n\n\n```python\nimport prettymaps\n\n# Run prettymaps in show = False mode (we're only interested in obtaining the GeoDataFrames)\nplot = prettymaps.plot('Centro Histórico, Porto Alegre', show = False)\nplot.geodataframes['building']\n```\n\n\n\n\n\u003cdiv\u003e\n\u003cstyle scoped\u003e\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n\u003c/style\u003e\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003egeometry\u003c/th\u003e\n      \u003cth\u003ebicycle\u003c/th\u003e\n      \u003cth\u003ehighway\u003c/th\u003e\n      \u003cth\u003eleisure\u003c/th\u003e\n      \u003cth\u003eaddr:housenumber\u003c/th\u003e\n      \u003cth\u003eaddr:street\u003c/th\u003e\n      \u003cth\u003eamenity\u003c/th\u003e\n      \u003cth\u003eoperator\u003c/th\u003e\n      \u003cth\u003ewebsite\u003c/th\u003e\n      \u003cth\u003ehistoric\u003c/th\u003e\n      \u003cth\u003e...\u003c/th\u003e\n      \u003cth\u003econtact:website\u003c/th\u003e\n      \u003cth\u003ebus\u003c/th\u003e\n      \u003cth\u003esmoothness\u003c/th\u003e\n      \u003cth\u003einscription\u003c/th\u003e\n      \u003cth\u003eways\u003c/th\u003e\n      \u003cth\u003eboat\u003c/th\u003e\n      \u003cth\u003ename:fr\u003c/th\u003e\n      \u003cth\u003etype\u003c/th\u003e\n      \u003cth\u003ebuilding:part\u003c/th\u003e\n      \u003cth\u003earchitect\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e(node, 2407915698)\u003c/th\u003e\n      \u003ctd\u003ePOINT (-51.23212 -30.03670)\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e820\u003c/td\u003e\n      \u003ctd\u003eRua Washington Luiz\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e(way, 126665330)\u003c/th\u003e\n      \u003ctd\u003ePOLYGON ((-51.23518 -30.03275, -51.23512 -30.0...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e387\u003c/td\u003e\n      \u003ctd\u003eRua dos Andradas\u003c/td\u003e\n      \u003ctd\u003eplace_of_worship\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e(way, 126665331)\u003c/th\u003e\n      \u003ctd\u003ePOLYGON ((-51.23167 -30.03066, -51.23160 -30.0...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e1001\u003c/td\u003e\n      \u003ctd\u003eRua dos Andradas\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003ehttps://www.ruadapraiashopping.com.br/\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e(way, 129176990)\u003c/th\u003e\n      \u003ctd\u003ePOLYGON ((-51.23117 -30.02891, -51.23120 -30.0...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e1020\u003c/td\u003e\n      \u003ctd\u003eRua 7 de Setembro\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003ehttp://www.memorial.rs.gov.br\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e(way, 129176991)\u003c/th\u003e\n      \u003ctd\u003ePOLYGON ((-51.23153 -30.02914, -51.23156 -30.0...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003ePraça da Alfândega\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003ehttps://www.margs.rs.gov.br/\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e...\u003c/th\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e(relation, 6760281)\u003c/th\u003e\n      \u003ctd\u003ePOLYGON ((-51.23238 -30.03337, -51.23223 -30.0...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e[457506887, 457506886]\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003emultipolygon\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e(relation, 6760282)\u003c/th\u003e\n      \u003ctd\u003ePOLYGON ((-51.23203 -30.03340, -51.23203 -30.0...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e[457506875, 457506889, 457506888]\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003emultipolygon\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e(relation, 6760283)\u003c/th\u003e\n      \u003ctd\u003ePOLYGON ((-51.23284 -30.03367, -51.23288 -30.0...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e[457506897, 457506896]\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003emultipolygon\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eTheodor Wiederspahn\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e(relation, 6760284)\u003c/th\u003e\n      \u003ctd\u003ePOLYGON ((-51.23499 -30.03412, -51.23498 -30.0...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e[457506910, 457506913]\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003emultipolygon\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e(relation, 14393526)\u003c/th\u003e\n      \u003ctd\u003ePOLYGON ((-51.23125 -30.02813, -51.23128 -30.0...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e1044\u003c/td\u003e\n      \u003ctd\u003eRua Siqueira Campos\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003ehttps://www.sefaz.rs.gov.br\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e[236213286, 1081974882]\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003emultipolygon\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e2420 rows × 167 columns\u003c/p\u003e\n\u003c/div\u003e\n\n\n\nSearch a building by name and display it:\n\n\n```python\nplot.geodataframes['building'][\n        plot.geodataframes['building'].name == 'Catedral Metropolitana Nossa Senhora Mãe de Deus'\n].geometry[0]\n```\n\n    /home/marcelo/anaconda3/envs/prettymaps/lib/python3.11/site-packages/geopandas/geoseries.py:648: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n      val = getattr(super(), mtd)(*args, **kwargs)\n\n\n\n\n\n    \n![svg](README_files/README_21_1.svg)\n    \n\n\n\nPlot mosaic of building footprints\n\n\n```python\nimport prettymaps\nimport numpy as np\nimport osmnx as ox\nfrom matplotlib import pyplot as plt\n\n# Run prettymaps in show = False mode (we're only interested in obtaining the GeoDataFrames)\nplot = prettymaps.plot('Porto Alegre', show = False)\n# Get list of buildings from plot's geodataframes dict\nbuildings = plot.geodataframes['building']\n# Project from lat / long\nbuildings = ox.project_gdf(buildings)\nbuildings = [b for b in buildings.geometry if b.area \u003e 0]\n\n# Draw Matplotlib mosaic of n x n building footprints\nn = 6\nfig,axes = plt.subplots(n,n, figsize = (7,6))\n# Set background color\nfig.patch.set_facecolor('#5cc0eb')\n# Figure title\nfig.suptitle(\n    'Buildings of Porto Alegre',\n    size = 25,\n    color = '#fff'\n)\n# Draw each building footprint on a separate axis\nfor ax,building in zip(np.concatenate(axes),buildings):\n    ax.plot(*building.exterior.xy, c = '#ffffff')\n    ax.autoscale(); ax.axis('off'); ax.axis('equal')\n```\n\n\n    \n![png](README_files/README_23_0.png)\n    \n\n\nAccess plot.ax or plot.fig to add new elements to the matplotlib plot: \n\n\n```python\nimport prettymaps\n\nplot = prettymaps.plot(\n    (41.39491,2.17557),\n    preset = 'barcelona',\n    show = False # We don't want to render the map yet\n)\n\n# Change background color\nplot.fig.patch.set_facecolor('#F2F4CB')\n# Add title\n_ = plot.ax.set_title(\n    'Barcelona',\n    font = 'serif',\n    size = 50\n)\n```\n\nUse **plotter** mode to export a pen plotter-compatible SVG (thanks to abey79's amazing [vsketch](https://github.com/abey79/vsketch) library)\n\n\n```python\nimport prettymaps\n\nplot = prettymaps.plot(\n    (41.39491,2.17557),\n    mode = 'plotter',\n    layers = dict(perimeter = {}),\n    preset = 'barcelona-plotter',\n    scale_x = .6,\n    scale_y = -.6,\n)\n```\n\n\n    \n![png](README_files/README_27_0.png)\n    \n\n\nSome other examples\n\n\n```python\nimport prettymaps\n\nplot = prettymaps.plot(\n    'Barra da Tijuca',\n    dilate = 0,\n    figsize = (22,10),\n    preset = 'tijuca',\n    adjust_aspect_ratio = False\n)\n```\n\n\n    \n![png](README_files/README_29_0.png)\n    \n\n\nUse prettymaps.create_preset() to create a preset:\n\n\n```python\nimport prettymaps\n\nprettymaps.create_preset(\n    \"my-preset\",\n    layers = {\n        \"building\": {\n            \"tags\": {\n                \"building\": True,\n                \"leisure\": [\n                    \"track\",\n                    \"pitch\"\n                ]\n            }\n        },\n        \"streets\": {\n            \"width\": {\n                \"trunk\": 6,\n                \"primary\": 6,\n                \"secondary\": 5,\n                \"tertiary\": 4,\n                \"residential\": 3.5,\n                \"pedestrian\": 3,\n                \"footway\": 3,\n                \"path\": 3\n            }\n        },\n    },\n    style = {\n        \"perimeter\": {\n            \"fill\": False,\n            \"lw\": 0,\n            \"zorder\": 0\n        },\n        \"streets\": {\n            \"fc\": \"#F1E6D0\",\n            \"ec\": \"#2F3737\",\n            \"lw\": 1.5,\n            \"zorder\": 3\n        },\n        \"building\": {\n            \"palette\": [\n                \"#fff\"\n            ],\n            \"ec\": \"#2F3737\",\n            \"lw\": 1,\n            \"zorder\": 4\n        }\n    }\n)\n\nprettymaps.preset('my-preset')\n```\n\n\n\n\n    Preset(params={'layers': {'building': {'tags': {'building': True, 'leisure': ['track', 'pitch']}}, 'streets': {'width': {'trunk': 6, 'primary': 6, 'secondary': 5, 'tertiary': 4, 'residential': 3.5, 'pedestrian': 3, 'footway': 3, 'path': 3}}}, 'style': {'perimeter': {'fill': False, 'lw': 0, 'zorder': 0}, 'streets': {'fc': '#F1E6D0', 'ec': '#2F3737', 'lw': 1.5, 'zorder': 3}, 'building': {'palette': ['#fff'], 'ec': '#2F3737', 'lw': 1, 'zorder': 4}}, 'circle': None, 'radius': None, 'dilate': None})\n\n\n\nUse **prettymaps.multiplot** and **prettymaps.Subplot** to draw multiple regions on the same canvas\n\n\n```python\nimport prettymaps\n\n# Draw several regions on the same canvas\nplot = prettymaps.multiplot(\n    prettymaps.Subplot(\n        'Cidade Baixa, Porto Alegre',\n        style={'building': {'palette': ['#49392C', '#E1F2FE', '#98D2EB']}}\n    ),\n    prettymaps.Subplot(\n        'Bom Fim, Porto Alegre',\n        style={'building': {'palette': ['#BA2D0B', '#D5F2E3', '#73BA9B', '#F79D5C']}}\n    ),\n    prettymaps.Subplot(\n        'Farroupilha, Porto Alegre',\n        layers = {'building': {'tags': {'building': True}}},\n        style={'building': {'palette': ['#EEE4E1', '#E7D8C9', '#E6BEAE']}}\n    ),\n    # Load a global preset\n    preset='cb-bf-f',\n    # Figure size\n    figsize=(12, 12)\n)\n```\n\n\n    \n![png](README_files/README_33_0.png)\n    \n\n\n# Add hillshade\n\n\n```python\nplot = prettymaps.plot(\n    'Honolulu',\n    radius = 5500,\n    figsize = 'a4',\n    layers = {'hillshade': {\n        'azdeg': 315,\n        'altdeg': 45,\n        'vert_exag': 1,\n        'dx': 1,\n        'dy': 1,\n        'alpha': 0.75,\n    }},\n)\n```\n\n    The autoreload extension is already loaded. To reload it, use:\n      %reload_ext autoreload\n    make: Entering directory '/home/marcelo/.cache/elevation/SRTM1'\n    make: Nothing to be done for 'download'.\n    make: Leaving directory '/home/marcelo/.cache/elevation/SRTM1'\n    make: Entering directory '/home/marcelo/.cache/elevation/SRTM1'\n    make: Nothing to be done for 'all'.\n    make: Leaving directory '/home/marcelo/.cache/elevation/SRTM1'\n    make: Entering directory '/home/marcelo/.cache/elevation/SRTM1'\n    cp SRTM1.vrt SRTM1.2d5b6f11e0e74b44a9386ba897fb0852.vrt\n    make: Leaving directory '/home/marcelo/.cache/elevation/SRTM1'\n    make: Entering directory '/home/marcelo/.cache/elevation/SRTM1'\n    gdal_translate -q -co TILED=YES -co COMPRESS=DEFLATE -co ZLEVEL=9 -co PREDICTOR=2 -projwin -157.90125854957773 21.364471426268267 -157.81006761682832 21.244615177105388 SRTM1.2d5b6f11e0e74b44a9386ba897fb0852.vrt /home/marcelo/Projects/Art/prettymaps/notebooks/elevationa.tif\n    rm -f SRTM1.2d5b6f11e0e74b44a9386ba897fb0852.vrt\n    make: Leaving directory '/home/marcelo/.cache/elevation/SRTM1'\n\n\n    WARNING:matplotlib.axes._base:Ignoring fixed y limits to fulfill fixed data aspect with adjustable data limits.\n\n\n\n    \n![png](README_files/README_35_2.png)\n    \n\n\n# Add keypoints\n\n\n```python\nplot = prettymaps.plot(\n    'Garopaba',\n    radius = 5000,\n    figsize = 'a4',\n    layers = {'building': False},\n    keypoints = {\n        # Search for general keypoints specified by OSM tags\n        'tags': {'natural': ['beach']},\n        # Or, search by specific name or free-text search\n        # pretymaps will use a fuzzy string matching to search for the specified name\n        'specific': {\n            'pedra branca': {'tags': {'natural': ['peak']}},\n        }\n    },\n)\n```\n\n\n    \n![png](README_files/README_37_0.png)\n    \n\n","funding_links":["https://ko-fi.com/marceloprates_","https://ko-fi.com/marceloprates_'"],"categories":["Jupyter Notebook","Planning Coding Resources","Python 程序","jupyter-notebook","Programming Languages","python"],"sub_categories":["Python","网络服务_其他"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarceloprates%2Fprettymaps","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarceloprates%2Fprettymaps","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarceloprates%2Fprettymaps/lists"}