The Geopandas DataFrame Coordinates Example
Table of Contents
Beginning
Imports
# python
from functools import partial
# pypi
import geopandas
import hvplot.pandas
import matplotlib.pyplot as pyplot
import pandas
# my stuff
from graeae import EmbedHoloviews
Set Up
Embed = partial(EmbedHoloviews, folder_path="files/posts/the-geopandas-dataframe-coordinates-example")
Middle
Longitudes and Latitudes
data = pandas.DataFrame(
{'City': ['Buenos Aires', 'Brasilia', 'Santiago', 'Bogota', 'Caracas'],
'Country': ['Argentina', 'Brazil', 'Chile', 'Colombia', 'Venezuela'],
'Latitude': [-34.58, -15.78, -33.45, 4.60, 10.48],
'Longitude': [-58.66, -47.91, -70.66, -74.08, -66.86]})
geoframe = geopandas.GeoDataFrame(data,
geometry=geopandas.points_from_xy(
data.Longitude, data.Latitude))
print(geoframe.head())
City Country Latitude Longitude geometry 0 Buenos Aires Argentina -34.58 -58.66 POINT (-58.66000 -34.58000) 1 Brasilia Brazil -15.78 -47.91 POINT (-47.91000 -15.78000) 2 Santiago Chile -33.45 -70.66 POINT (-70.66000 -33.45000) 3 Bogota Colombia 4.60 -74.08 POINT (-74.08000 4.60000) 4 Caracas Venezuela 10.48 -66.86 POINT (-66.86000 10.48000)
Plot It
# read in the plotting data
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
# restrict it to South America.
ax = world[world.continent == 'South America'].plot(
color='white', edgecolor='black')
# We can now plot our ``GeoDataFrame``.
geoframe.plot(ax=ax, color='red')
pyplot.savefig("files/posts/the-geopandas-dataframe-coordinates-example/south_america.png")
With Holoviews
Since this is going to be interactive we can add more to the plot.
print(world.head())
pop_est continent name iso_a3 gdp_md_est \ 0 920938 Oceania Fiji FJI 8374.0 1 53950935 Africa Tanzania TZA 150600.0 2 603253 Africa W. Sahara ESH 906.5 3 35623680 North America Canada CAN 1674000.0 4 326625791 North America United States of America USA 18560000.0 geometry 0 MULTIPOLYGON (((180.00000 -16.06713, 180.00000... 1 POLYGON ((33.90371 -0.95000, 34.07262 -1.05982... 2 POLYGON ((-8.66559 27.65643, -8.66512 27.58948... 3 MULTIPOLYGON (((-122.84000 49.00000, -122.9742... 4 MULTIPOLYGON (((-122.84000 49.00000, -120.0000...
Let's add the population estimate to the countries and the city to the points.
world_plot = world[world.continent == "South America"].hvplot(
color="white",
x="Longitude",
y="Latitude",
legend=False,
hover_cols=["pop_est", "name"])
# NOTE: the overlay uses the pandas.DataFrame, not the GeoDataFrame
points = data.hvplot.points("Longitude", "Latitude", hover_cols=["City"])
plot = (world_plot * points).opts(
title="South American Cities",
width=700,
height=890,
)
outcome = Embed(plot=plot, file_name="south_america", height_in_pixels=1000)()
print(outcome)
This was mostly a check to see if I could get it working so I'll have to think about adding more explanations later.
Notes
- To get matplotlib to work I had to install descartes (
pip install descartes
) - To get hvplot to work I had to install geoviews (
pip install geoviews
)
Links
- The Geopandas Example
- coderzcolumn example showing hvplot with geopandas
- Stack Overflow answer to adding columns to the hover