python - real - ¿Cómo cambio la proyección de la trama secundaria de matplotlib de un eje existente?
matplotlib python (1)
No puede cambiar la proyección de un eje existente, la razón se explica a continuación. Sin embargo, la solución a su problema subyacente es simplemente usar el argumento plt.subplots()
para plt.subplots()
descrito en la documentación de matplotlib here . Por ejemplo, si quisiera que todas sus cartopy.crs.PlateCarree
tuvieran la proyección cartopy.crs.PlateCarree
, podría hacerlo
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
# Create a grid of plots
fig, (ax1, ax2) = plt.subplots(ncols=2, subplot_kw={''projection'': ccrs.PlateCarree()})
Con respecto a la pregunta real, especificar una proyección al crear un conjunto de ejes determina la clase de ejes que se obtiene, que es diferente para cada tipo de proyección. Por ejemplo
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
ax1 = plt.subplot(311)
ax2 = plt.subplot(312, projection=''polar'')
ax3 = plt.subplot(313, projection=ccrs.PlateCarree())
print(type(ax1))
print(type(ax2))
print(type(ax3))
Este código imprimirá lo siguiente
<class ''matplotlib.axes._subplots.AxesSubplot''>
<class ''matplotlib.axes._subplots.PolarAxesSubplot''>
<class ''cartopy.mpl.geoaxes.GeoAxesSubplot''>
Observe cómo cada eje es en realidad una instancia de una clase diferente.
Estoy tratando de construir una función simple que tome una instancia de matplotlib.axes._subplots.AxesSubplot
( matplotlib.axes._subplots.AxesSubplot
) y transforme su proyección en otra proyección, por ejemplo, en una de las proyecciones cartopy.crs.CRS
.
La idea se ve algo como esto.
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
def make_ax_map(ax, projection=ccrs.PlateCarree()):
# set ax projection to the specified projection
...
# other fancy formatting
ax2.coastlines()
...
# Create a grid of plots
fig, (ax1, ax2) = plt.subplots(ncols=2)
# the first subplot remains unchanged
ax1.plot(np.random.rand(10))
# the second one gets another projection
make_ax_map(ax2)
Por supuesto, solo puedo usar la función fig.add_subplot()
:
fig = plt.figure(figsize=(10,5))
ax1 = fig.add_subplot(121)
ax1.plot(np.random.rand(10))
ax2 = fig.add_subplot(122,projection=ccrs.PlateCarree())
ax2.coastlines()
pero me preguntaba si existe un método matplotlib
adecuado para cambiar una proyección de eje de subparcela después de que se haya definido. La lectura de la API matplotlib no ayudó desafortunadamente.