Wie kann sichergestellt werden, dass Cartopy-Funktionen gerendert werden, nachdem der Axes-Box-Aspekt von matplotlib fesPython

Python-Programme
Anonymous
 Wie kann sichergestellt werden, dass Cartopy-Funktionen gerendert werden, nachdem der Axes-Box-Aspekt von matplotlib fes

Post by Anonymous »

Ich habe eine Funktion, die eine Karte erstellt, wenn ein DataFrame mit Lat/Lon-Koordinaten gegeben wird. Unabhängig von der Form der Spur, die aus Koordinatenpaaren und Zeitstempeln gezeichnet werden kann, möchte ich mithilfe von axis.set_box_aspect() sicherstellen, dass das Seitenverhältnis der Achsenbox gleich bleibt. Nachfolgend finden Sie einige Beispielcodes zum Rendern einer Karte:

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)
Abhängigkeitsversionen:

Code: Select all

matplotlib==3.10.7

Code: Select all

pandas==2.3.3

Code: Select all

cartopy==0.25.0
Ich habe jedoch gelernt, dass set_box_aspect nur die physischen Abmessungen des Achsenfelds steuert und keinen Einfluss auf die Datengrenzen innerhalb der Achsen hat. Was letztendlich passiert, ist, dass Cartopy-Features, die nur außerhalb des Bereichs der bereitgestellten Daten vorhanden sind, nicht gerendert werden. In der angehängten Ausgabe unten sehen Sie, dass die Grenzen um die Inseln Jamaika und Puerto Rico nicht in der Karte enthalten sind, gerade weil sie außerhalb der x/y-Grenzen der Daten liegen:

map_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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post