1

I am trying to show a spatial distribution of shops on a map using Geopandas and Matplotlib.

Problem: When I am plotting the pins the base map gets distorted. Here is a sample before plotting the pins polygon and after after.

Question: What is the source of this distortion? How can I prevent it?

import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
from shapely.geometry import Polygon

# Creating the simplified polygon
latitude = [60.41125, 59.99236, 59.99236]
longitude = [24.66917, 24.66917, 25.36972]
geometry = Polygon(zip(longitude, latitude))
polygon = gpd.GeoDataFrame(index=[0], crs = 'epsg:4326', geometry=[geometry]) 

# ploting  the basemap
ax = polygon.plot(color="#3791CB")

# Dict of sample coordinates
coordinates = {"latitude": ["60.193141", "60.292777", "60.175053", "60.163187", "60.245272", "60.154392", "60.182906"],
"longitude": ["24.934214", "24.969730", "24.831068", "24.739044", "24.860983", "24.884773", "24.959175"]}

# Creating a dataframe from coordinates
df = pd.DataFrame(coordinates)

# Creating the GeoDataFrame
shops = gpd.GeoDataFrame(coordinates, geometry=gpd.points_from_xy(df.longitude, df.latitude))

# Plotting office coordinates
shops.plot(ax=ax, color="red", markersize = 20, zorder=2)

# adding grid
plt.grid(linestyle=":", color='grey')

plt.show()

Thank you!

1 Answer 1

1

You're map and pins have different reference systems..

When you create your first GeoDataFrame you specify its Coordinate Reference System (crs = 'epsg:4326'). When you create the geodataframe for the shop coordinates you don't. This is where the distortion is coming from..

This should fix it:

shops = gpd.GeoDataFrame(
        coordinates, 
        geometry = gpd.points_from_xy(
              df.longitude, 
              df.latitude), 
              crs = "EPSG:4326" 
              )
        ) 

Cheers!

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.