Customizando vários subplots no Matplotlib
Um tutorial de como criar múltiplos gráficos em uma mesma figura no Python
Assim como eu, você já deve ter tentado criar ou juntar vários gráficos na mesma figura e ficou um pouco confuso e frustrado sobre como fazer isso, e acabou partindo para o bom e velho Power Point e o Paint da Microsoft. O problema de recorrer a esse sistema de “inserir” figuras nestes programas é a baixa qualidade e resolução da imagem final. Principalmente se você precisa de uma alta qualidade para jornais científicos, que exigem no mínimo 1000 dpi (que é o meu caso hehe). Pensando nisso, eu vou trazer aqui uma solução bem rápida para você nunca mais esquecer!!!
Primeiramente, você sabe o que é um subplot??
Também podem ser chamados de subparcelas ou subtramas, é quando várias vertentes secundárias se juntam para forma um único trama (sim, lembrem do bordado, onde as mulheres tecem linhas para formar um tecido). Então esse é o objetivo, juntar diferentes gráficos que tenham um mesmo fim, para representar o que você quer. Vamos testar um exemplo originado da documentação do Python:
import matplotlib.pyplot as plt
import numpy as npfig, axes = plt.subplots(2, 2, subplot_kw=dict(polar=True))
x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2) + np.cos(x)
derivative = 2 * x * np.cos(x**2) - np.sin(x)axes[0, 0].plot(x, y)
axes[0, 1].plot(x, np.sin(x**2) + np.cos(x**3))
axes[1, 0].plot(x, np.cos(x) * np.sin(x**2))
axes[1, 1].plot(x, derivative, "g--")
Esse é um exemplo simples de subtrama ou Grid 4x4. Existem diversas formas para você construir subplots no Python, entre elas, você vai encontrar na documentação do Matplotlib dessas seguintes formas:
fig, (ax) = plt.subplots(2, 2, sharey='row')# ourows, cols = 2, 2
fig, ax = plt.subplots(rows, cols,
sharex='col',
sharey='row')# ouplt.subplot(2,2)
Agora vamos focar no jeito fácil!!! Eu bati um pouco a cabeça com as duas primeiras formas e acabei desistindo, porque não suportava com o que eu estava tentando realizar, ou não condizia com os gráficos Seaborn, por exemplo. Para quem não conhece, conseguimos customizar gráficos seaborn usando o matplotlib, por isso, eu prefiro usar a última opção. Pensando nas dúvidas e nos estudos que eu fiz, vamos usar a última opção, segue essa dica de ouro para nunca mais esquecer:
Para exemplificar ainda mais, vou construir um grid 4x4 (2 linhas, 2 colunas) usando dados de notas de alunos de uma escola do Reino Unido, esse dataset está disponível aqui no Kaggle.
Notem que eu criei diferentes gráficos a partir desse dataset, usando o fig.add_subplot(22X) com 2 linhas e 2 colunas, onde X é o número do gráfico, como:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns#definindo o tamanho das figuras
fig = plt.figure(figsize=(15, 15))# Gráfico 1 - Barras de Count
fig.add_subplot(221)
sns.countplot(df[‘G3’])# Gráfico 2 - Boxplot de Reason
fig.add_subplot(222)
sns.boxplot(x=”reason”, y=’G3', data=df)# Gráfico 3 - Boxplot de Absences
fig.add_subplot(223)
sns.boxplot(x=”absences”, y=’G3', data=df)# Gráfico 4 - Boxplot violino de Reason
fig.add_subplot(224)
sns.violinplot(x = ‘G3’, y = ‘reason’, data=df, palette=”Set3", bw=.2, cut=1, split=True, linewidth=1)
Agora que nosso gráfico está pronto, vamos customizar!
Aumentando a fonte dos eixos
Podemos aumentar a fonte dos eixos X e Y, para isso, precisamos dar nomes aos subplots, por exemplo vou denomixar ax1, ax2, ax3, ax4 e inserir tamanho da fonte número 14, como:
fig = plt.figure(figsize=(15, 15))ax1 = fig.add_subplot(221)
sns.countplot(df[‘G3’])
ax1.tick_params(axis=’x’, labelsize=14)
ax1.tick_params(axis=’y’, labelsize=14)ax2 = fig.add_subplot(222)
sns.boxplot(x=”reason”, y=’G3', data=df)
ax2.tick_params(axis=’x’, labelsize=14)
ax2.tick_params(axis=’y’, labelsize=14)ax3 = fig.add_subplot(223)
sns.boxplot(x=”absences”, y=’G3', data=df)
ax3.tick_params(axis=’x’, labelsize=14)
ax3.tick_params(axis=’y’, labelsize=14)ax4 = fig.add_subplot(224)
sns.violinplot(x = ‘G3’, y = ‘reason’, data=df, palette=”Set3", bw=.2, cut=1, split=True, linewidth=1)
ax4.tick_params(axis=’x’, labelsize=14)
ax4.tick_params(axis=’y’, labelsize=14)
Criando espaçamento entre os gráficos
Agora que aumentamos as fontes dos eixos, pode ser que os gráficos se choquem, para evitar a poluição das informações vamos inserir espaços entre eles, usando o código abaixo, onde “wspace” é o espaço na horizontal e “hspace” é o espaçamento na vertical entre os gráficos.
#espaço entre os gráficos
plt.subplots_adjust(wspace=0.3,hspace=0.1)
Definindo e padronizando o intervalo do eixo X e Y
Também podemos definir um intervalo entre os eixos, para padronizar a escala de vários gráficos que tenham a mesma unidade. Vamos fazer um exemplo usando o gráfico 3 (que ficou bem poluído na nossa primeira plotagem). Para padronizar o intervalo usamos o ax3.set_xylim(value,value), como o código abaixo:
# Definindo e padronizando o intervalo do eixo X e Y
ax3 = fig.add_subplot(223)
sns.boxplot(x=”absences”, y=’G3', data=df)
ax3.tick_params(axis=’x’, labelsize=14)
ax3.tick_params(axis=’y’, labelsize=14)
ax3.set_xlim(-1, 25)#Definindo intervalo do eixo X
ax3.set_ylim(-1, 25)#Definindo intervalo do eixo Y
Adicionando rótulos
Também podemos mudar os nomes dos rótulos e aumentar a fonte, vamos continuar usando o exemplo do gráfico 3, substituindo a palavra em Inglês Absences por “Faltas” e no eixo Y vamos colocar “Notas dos alunos-G3”, como:
# Adicionando rótulos
ax3.set_xlabel(‘Faltas’, fontsize=15)
ax3.set_ylabel(‘Notas dos alunos — G3’, fontsize=15)
Nosso gráfico está pronto, menos poluído e mais visível! Agora faça o teste e treine construindo diversos grids em Python, eu já cheguei a construir um subplot(63X), um grid com 6 linhas e 3 colunas (ou seja, 18 gráficos em uma única imagem!). Espero ter ajudado a superar o medo de fazer subplots em Python (assim como eu superei :D). O script completo desses gráficos está disponível no meu GitHub, qualquer dúvida e futuras conexões me contate no LinkedIn.
Até loguinho Neurônicos! hehehe
Referências
Documentação do Matplotib — tutorial de subplots
How to create subplots in Python using Matplotlib
5 Powerful tricks to visualize your data with Matplotlib