Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Aula "Combinando e salvando figuras" (Solução alternativa)

Boa tarde,

Meu questionamento sobre a aula é: foi ensinado a unir as imagens geradas pelos gráficos em uma única imagem com o comando:

from PIL import Image

largura, altura = Image.open('histograma_ivg.png').size
combinada = Image.new("RGB", (3*largura, altura))
intervalo = 0
for imagem in map(Image.open, ['histograma_iv.png', 'histograma_is.png',
                               'histograma_ivg.png']):
    combinada.paste(imagem, (intervalo, 0))
    intervalo += largura

combinada.save('combinada.png')

Não seria mais prático e versátil utilizar a função matplotlib.pyplot.subplots para criar uma fig que englobasse as três figuras? Podendo inclusive compartilhar os eixos dos gráficos.

1 resposta
solução!

Oi Ruy! Tudo bem com você?

Peço desculpas pela demora em dar um retorno.

Sim! Seria possível fazer essa figura combinada por meio da função subplots. Entretanto, acredito que compartilhar os eixos das mesmas não funcionaria muito bem, uma vez que, os valores encontrados em cada um dos 3 histogramas gerados variam muito.

Fazendo um código aqui para gerar esses gráficos em um único subplot, primeiramente eu criei a figura e os 3 eixos por meio do comando:

fig, (eixo, eixo2, eixo3) = plt.subplots(1,3, figsize=(25,10))

Como a intenção era colocar os 3 gráficos lado a lado, optei por criar 1 linha com 3 colunas. E nomeei os respectivos eixos como eixo, eixo2 e eixo3. Após isso, foi feito o mesmo procedimento que o professor realizou para a criação dos gráficos, o que mudou foi que, agora, cada gráfico possui um nome diferente para a variável que armazena cada um de seus eixos:

import matplotlib.pyplot as plt

fig, (eixo, eixo2, eixo3) = plt.subplots(1,3, figsize=(25,10))

#------------------------------------------------ grafico 1 -------------------------------------------------------------------

df_iv = df[df['espécie'] == 'Iris-versicolor']
mu, sigma = df['comprimento_pétala'].mean(), df['comprimento_pétala'].std()

eixo.hist(df['comprimento_pétala'], bins=20)
eixo.set_title('Histograma', fontsize=15, pad=10)
eixo.set_xlabel('Comprimento da pétala', fontsize=15)
eixo.grid(True)

eixo.annotate('$\mu - {0:.2f}$\n$\sigma - {1:.2f}$ '.format(mu, sigma),
             xy=(4.5, 20), fontsize=20)

eixo.axvline(mu, color='k', linestyle='--')
eixo.annotate('média', xy= (mu-1.3, 28), fontsize=20)

eixo.axvline(df['comprimento_pétala'].median(), color='g', linestyle='--')
eixo.annotate('mediana', xy=(df['comprimento_pétala'].median(), 31), fontsize=20)

#------------------------------------------------ grafico 2 -------------------------------------------------------------------

df_is = df[df['espécie'] == 'Iris-setosa']
mu, sigma = df_is['comprimento_pétala'].mean(), df_is['comprimento_pétala'].std()

eixo2.hist(df_is['comprimento_pétala'], bins=20)
eixo2.set_title('Iris Setosa', fontsize=15, pad=10)
eixo2.set_xlabel('Comprimento da pétala', fontsize=15)
eixo2.grid(True)

eixo2.annotate('$\mu - {0:.2f}$\n$\sigma - {1:.2f}$ '.format(mu, sigma),
             xy=(1.7, 7), fontsize=20)

eixo2.axvline(mu, color='k', linestyle='--')
eixo2.annotate('média', xy= (mu-0.2, 13.5), fontsize=20)

eixo2.axvline(df_is['comprimento_pétala'].median(), color='g', linestyle='--')
eixo2.annotate('mediana', xy=(df_is['comprimento_pétala'].median()+0.05, 12), fontsize=20, 
              color='g')

#------------------------------------------------ grafico 3 -------------------------------------------------------------------

df_v = df[df['espécie'] == 'Iris-virginica']
mu, sigma = df_v['comprimento_pétala'].mean(), df_v['comprimento_pétala'].std()

eixo3.hist(df_v['comprimento_pétala'], bins=20)
eixo3.set_title('Iris Virginica', fontsize=15, pad=10)
eixo3.set_xlabel('Comprimento da pétala', fontsize=15)
eixo3.grid(True)

eixo3.annotate('$\mu - {0:.2f}$\n$\sigma - {1:.2f}$ '.format(mu, sigma),
             xy=(6.3, 7), fontsize=20)

eixo3.axvline(mu, color='k', linestyle='--')
eixo3.annotate('média', xy= (mu, 8), fontsize=20)

eixo3.axvline(df_v['comprimento_pétala'].median(), color='g', linestyle='--')
eixo3.annotate('mediana', xy=(df_v['comprimento_pétala'].median(), 7), fontsize=20, 
              color='g')

fig.savefig('combinada_subplots.png', bbox_inches='tight')

Fazendo dessa forma, nós obtemos o seguinte resultado:

Imagem dos 3 gráficos gerados pelo código acima, sendo eles histogramas com barras de corres azul e contendo setinhas que indicam a media e a mediana

E por meio da última linha desse código fig.savefig('combinada_subplots.png', bbox_inches='tight') nós salvamos a figura conforme o professor faz em aula.

Espero ter ajudado.

Qualquer dúvida estou por aqui, tá bom?

Bons estudos!