Code: Select all
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plot
import pandas as pd
MAP_FIXED_WIDTH = 8
MAP_FIXED_HEIGHT = 6
df = pd.DataFrame(
{
"timestamp":
[
pd.Timestamp('2025-01-01 00:00:00 UTC'),
pd.Timestamp('2025-01-01 00:30:00 UTC'),
pd.Timestamp('2025-01-01 01:00:00 UTC'),
pd.Timestamp('2025-01-01 01:30:00 UTC'),
pd.Timestamp('2025-01-01 02:00:00 UTC'),
],
"latitude": [20,22,24,26,28],
"longitude": [-45,-40,-35,-30,-25],
},
)
def create_map_with_scatter_points(df: pd.DataFrame) -> None:
plot.figure(figsize=(MAP_FIXED_WIDTH, MAP_FIXED_HEIGHT))
axes = plot.axes(
projection=ccrs.PlateCarree(central_longitude=df["longitude"].median())
)
axes.set_box_aspect(MAP_FIXED_HEIGHT / MAP_FIXED_WIDTH)
axes.scatter(df["longitude"], df["latitude"], color='green')
axes.set_facecolor(cfeature.COLORS["water"])
axes.add_feature(cfeature.LAND, color="lightgray")
axes.add_feature(cfeature.LAKES)
axes.add_feature(cfeature.RIVERS)
axes.add_feature(cfeature.COASTLINE)
axes.add_feature(cfeature.BORDERS, linestyle=":")
axes.gridlines(
draw_labels=True, linewidth=1, color="gray", alpha=0.5, linestyle="--"
)
plot.show()
create_map_with_scatter_points(df)
Code: Select all
matplotlib==3.10.7Code: Select all
pandas==2.3.3Code: Select all
cartopy==0.25.0map_output_missing_borders
Leider gibt die Verwendung von axis.set_aspect(aspect='equal',adjustable='datalim') auch das gleiche Ergebnis zurück, da set_adjustable dies ignoriert explizite Datengrenzen.
Im Idealfall möchte ich vermeiden, die Logik manuell erstellen zu müssen, um ein Box-Seitenverhältnis durch axis.set_extent zu erzwingen, insbesondere weil es schwierig sein kann, sicherzustellen, dass der richtige zentrale Längengrad für Karten verwendet wird, bei denen Daten den 180. Meridian kreuzen und der Längengrad zwischen +/- 180 wechselt.
Ist noch jemand auf dieses Problem gestoßen, als er Karten mit matplotlib und erstellt hat? cartopy, und gibt es irgendwelche Problemlösungen, die Sie gefunden haben?
Mobile version