J'ai une liste de caractéristiques géométriques que je souhaite visualiser côte à côte sous forme de sous-graphiques. Quand je tape:

for i in iaq:

fig, ax = plt.subplots(figsize=(8,5))
df_g2[df_g2['aq_date'] == i].plot(column='zone_id', cmap='Greens', ax=ax, legend=True)
ax.set_title('Analysis :'+ str(i))
plt.show()

Une liste de 40 cartes apparaît les unes après les autres dans une liste. Mais je veux les organiser dans un arrangement ligne-colonne 5 * 8. Quand j'essaye de donner une taille de l'arrangement comme:

fig, ax = plt.subplots(nrows=8, ncols=5)
fig.set_size_inches(6,4)

for i in iaq:
   df_g2[df_g2['aq_date'] == i].plot(column='zone_id', cmap='Greens', ax=ax, legend=True)
   ax.set_title('Analysis :'+ str(i))
   plt.show()

Je reçois le message d'erreur:

enter image description here

Veuillez aider.

0
tahmid0945 31 oct. 2020 à 05:53

2 réponses

Meilleure réponse

Comme je n'ai pas accès à votre dataframe, j'utiliserai le naturalearth_lowres intégré pour tracer un tableau de pays sélectionnés. Lisez les commentaires dans le code pour clarifier les étapes importantes.

import geopandas as gpd
import matplotlib.pyplot as plt

# for demo purposes, use the builtin data
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))

# set number of subplots' (columns, rows) enough to use
cols, rows = 2,3  #num of subplots <= (cols x rows)

# create figure with array of axes
fig, axs = plt.subplots(nrows=rows, ncols=cols)
fig.set_size_inches(6, 10)  #set it big enough for all subplots

# select some countries to plot
# number of them is intended to be less than (cols x rows)
# the remaining subplots will be discarded
iaq = ['IND', 'TZA', 'CAN', 'THA', 'BRN']

count = 0
for irow in range(axs.shape[0]):
    for icol in range(axs.shape[1]):
        #print(icol, irow)
        if count<len(iaq):
            # plot that country on current axes
            world[ world['iso_a3'] == iaq[count] ].plot(ax=axs[irow][icol])
            axs[irow][icol].set_title('world:iso_a3: '+iaq[count])
            count +=1
        else:
            # hide extra axes
            axs[irow][icol].set_visible(False)

plt.show()

L'intrigue résultante:

enter image description here

1
swatchai 31 oct. 2020 à 17:21

J'ai résolu le problème avec le référence. Sans la fonction trim_axs() ici, 'numpy.ndrray' se produit.

import numpy as np
import matplotlib.pyplot as plt

figsize = (9, 9)
cols = 5
rows = 8

x = np.linspace(0, 10, 500)
y = np.sin(x)

def trim_axs(axs, N):
    """
    Reduce *axs* to *N* Axes. All further Axes are removed from the figure.
    """
    axs = axs.flat
    for ax in axs[N:]:
        ax.remove()
    return axs[:N]

axs = plt.figure(figsize=figsize, constrained_layout=True).subplots(rows, cols)
axs = trim_axs(axs, cols*rows)
for ax, i in zip(axs, range(1,(cols*rows)+1)):
    ax.set_title('Analysis :'+ str(i))
    ax.plot(x, y, 'o', ls='-', ms=4)

enter image description here

1
r-beginners 31 oct. 2020 à 04:03