Customizando vários subplots no Matplotlib

Um tutorial de como criar múltiplos gráficos em uma mesma figura no Python

Nayane Maia
neurondsai

--

Unsplash

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 np
fig, 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:

Imagem: Nayane Maia

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)
Subplots no Python

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

Matplolib styles for scientific plotting

Customizing multiple subplots in Matplotlib

--

--

Nayane Maia
neurondsai

Agronomist and Data Scientist, with the application of advanced statistical modeling techniques in agriculture