OSGeoLive-Notebooks/geopandas-tutorial/04-more-on-visualization.ipynb

362 lines
8.5 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Visualizing spatial data with Python"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import pandas as pd\n",
"import geopandas\n",
"\n",
"import matplotlib.pyplot as plt\n",
"\n",
"pd.options.display.max_rows = 10"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# o13 filepaths\n",
"countries = geopandas.read_file(\"/home/user/data/natural_earth2/ne_10m_admin_0_countries.shp\")\n",
"cities = geopandas.read_file(\"/home/user/data/natural_earth2/ne_10m_populated_places.shp\")\n",
"rivers = geopandas.read_file(\"/home/user/data/natural_earth2/ne_10m_rivers_lake_centerlines.shp\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## GeoPandas visualization functionality"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Basic plot"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"countries.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Adjusting the figure size"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"countries.plot(figsize=(15, 15))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Removing the box / x and y coordinate labels"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ax = countries.plot(figsize=(15, 15))\n",
"ax.set_axis_off()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Coloring based on column values\n",
"\n",
"Let's first create a new column with the GDP per capita:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"countries = countries[(countries['pop_est'] >0 ) & (countries['name'] != \"Antarctica\")]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"countries['gdp_per_cap'] = countries['gdp_md_est'] / countries['pop_est'] * 100"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"ax = countries.plot(figsize=(15, 15), column='gdp_md_est' )\n",
"ax.set_axis_off()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and now we can use this column to color the polygons: (TODO)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#ax = countries.plot(figsize=(15, 15), column='gdp_per_cap', scheme='quantiles', legend=True)\n",
"#ax.set_axis_off()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Combining different dataframes on a single plot\n",
"\n",
"The `.plot` method returns a matplotlib Axes object, which can then be re-used to add additional layers to that plot with the `ax=` keyword:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ax = countries.plot(figsize=(15, 15))\n",
"cities.plot(ax=ax, color='red', markersize=10)\n",
"ax.set_axis_off()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ax = countries.plot(edgecolor='k', facecolor='none', figsize=(15, 10))\n",
"rivers.plot(ax=ax)\n",
"cities.plot(ax=ax, color='C1')\n",
"ax.set(xlim=(-20, 60), ylim=(-40, 40))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using `cartopy`\n",
"\n",
"Cartopy is the base matplotlib cartographic library, and it is used by `geoplot` under the hood to provide projection-awareness.\n",
"\n",
"http://scitools.org.uk/cartopy/docs/latest/index.html\n",
"\n",
"The following example is taken from the docs: http://geopandas.readthedocs.io/en/latest/gallery/cartopy_convert.html#sphx-glr-gallery-cartopy-convert-py"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from cartopy import crs as ccrs"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Define the CartoPy CRS object.\n",
"crs = ccrs.AlbersEqualArea()\n",
"\n",
"# This can be converted into a `proj4` string/dict compatible with GeoPandas\n",
"crs_proj4 = crs.proj4_init\n",
"countries_ae = countries.to_crs(crs_proj4)\n",
"\n",
"# Here's what the plot looks like in GeoPandas\n",
"countries_ae.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Interactive web-based visualizations\n",
"\n",
"There are nowadays many libraries that target interactive web-based visualizations and that can handle geospatial data. Some packages with an example for each:\n",
"\n",
"- Bokeh: https://bokeh.pydata.org/en/latest/docs/gallery/texas.html\n",
"- GeoViews (other interface to Bokeh/matplotlib): http://geo.holoviews.org\n",
"- Altair: https://altair-viz.github.io/gallery/choropleth.html\n",
"- Plotly: https://plot.ly/python/#maps\n",
"- ..."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Another popular javascript library for online maps is [Leaflet.js](https://leafletjs.com/), and this has python bindings in the [folium](https://github.com/python-visualization/folium) and [ipyleaflet](https://github.com/jupyter-widgets/ipyleaflet) packages."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"An example with folium:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"# TODO Folium\n",
"import folium"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"m = folium.Map([48.8566, 2.3429], zoom_start=6, tiles=\"OpenStreetMap\")\n",
"folium.GeoJson(cities.to_json()).add_to(m)\n",
"m"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"m = folium.Map([48.8566, 2.3429], zoom_start=6, tiles=\"OpenStreetMap\")\n",
"folium.GeoJson(countries.to_json()).add_to(m)\n",
"m"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using `geoplot`\n",
"\n",
"The `geoplot` packages provides some additional functionality compared to the basic `.plot()` method on GeoDataFrames:\n",
"\n",
"- High-level plotting API (with more plot types as geopandas)\n",
"- Native projection support\n",
"\n",
"https://residentmario.github.io/geoplot/index.html"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# TODO\n",
"import geoplot\n",
"import geoplot.crs as gcrs"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"fig, ax = plt.subplots(figsize=(10, 10), subplot_kw={\n",
" 'projection': gcrs.Orthographic(central_latitude=40.7128, central_longitude=-74.0059)\n",
"})\n",
"geoplot.choropleth(countries, hue='gdp_per_cap', projection=gcrs.Orthographic(), ax=ax,\n",
" cmap='magma', linewidth=0.5, edgecolor='white', k=None)\n",
"ax.set_global()\n",
"ax.outline_patch.set_visible(True)\n",
"#ax.coastlines()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}