Como consertar o objeto 'numpy.ndarray' não tem atributo 'get_figure' ao plotar subtramas

Oct 06 2020

Escrevi o código a seguir para traçar 6 gráficos de pizza em subtramas diferentes, mas recebo um erro. Este código funciona corretamente se eu usá-lo para plotar apenas 2 gráficos, mas produz um erro para qualquer coisa além disso.

Tenho 6 variáveis ​​categóricas em meu conjunto de dados, cujos nomes estão armazenados na lista cat_cols. Os gráficos devem ser traçados a partir dos dados de treinamento train.

CÓDIGO

fig, axes = plt.subplots(2, 3, figsize=(24, 10))

for i, c in enumerate(cat_cols):
  
  train[c].value_counts()[::-1].plot(kind = 'pie', ax=axes[i], title=c, autopct='%.0f', fontsize=18)
  axes[i].set_ylabel('')
    
plt.tight_layout()

ERRO

AttributeError: 'numpy.ndarray' object has no attribute 'get_figure'

Como podemos retificar isso?

Respostas

3 TrentonMcKinney Oct 06 2020 at 16:37
  • O problema é plt.subplots(2, 3, figsize=(24, 10))criar dois grupos de 3 subtramas, não um grupo de seis subtramas.
array([[<AxesSubplot:xlabel='radians'>, <AxesSubplot:xlabel='radians'>, <AxesSubplot:xlabel='radians'>],
       [<AxesSubplot:xlabel='radians'>, <AxesSubplot:xlabel='radians'>, <AxesSubplot:xlabel='radians'>]], dtype=object)
  • Descompacte todas as matrizes de subplot de axes, usando axes.ravel().
    • numpy.ravel, que retorna uma matriz achatada.
    • Uma compreensão de lista também funcionará, axe = [sub for x in axes for sub in x]
  • Atribua cada plotagem a uma das subparcelas em axe.
  • Como resolver AttributeError: o objeto 'numpy.ndarray' não tem o atributo 'get_figure' quando plotar subtramas é um problema semelhante.
import pandas as pd
import numpy as np

# sinusoidal sample data
sample_length = range(1, 6+1)
rads = np.arange(0, 2*np.pi, 0.01)
data = np.array([np.sin(t*rads) for t in sample_length])
df = pd.DataFrame(data.T, index=pd.Series(rads.tolist(), name='radians'), columns=[f'freq: {i}x' for i in sample_length])

# crate the figure and axes
fig, axes = plt.subplots(2, 3, figsize=(24, 10))

# unpack all the axes subplots
axe = axes.ravel()

# assign the plot to each subplot in axe
for i, c in enumerate(df.columns):
    df[c].plot(ax=axe[i])