import pandas as pd
5 CD: Visualização
6 Introdução
Como apresentado na última aula, estamos agora aprendendo a realizar um “projeto de Ciência de Dados”. Nesta aula, veremos o processo de vizualização de um dados.
6.1 Visualização de Dados
Aqui, serei preguiçoso, o texto do Hadley Wickham é muito bom:
Visualisation is a fundamentally human activity. A good visualisation will show you things that you did not expect, or raise new questions about the data. A good visualisation might also hint that you’re asking the wrong question, or you need to collect different data. Visualisations can surprise you, but don’t scale particularly well because they require a human to interpret them.
Basicamento nosso objetivo aqui é olhar para um data frame e entender quais informações queremos tirar dele e como fazer isso, para depois podermos modelar esses dados.
O caminho é o seguinte:
- Na aula 4, aprendemos as etapas de tidy e transform.
- Nesta aula, aprenderemos a etapa visualize.
- Na aula 6, aprenderemos a etapa model.
- Por fim, na aula 7, juntaremos tudo, aprendendo como fazer um projeto completo. Adicionalmente, aprenderemos como organizar um script para tal.
6.1.1 Índice
- Vizualização de estatísticas descritivas de diferentes dados
- Elementos de um gráfico
- Como fazer gráficos com matplotlib
- Recapitulando
- Extras
- Outros
6.2 Sumarização com Pandas
Uma maneira de visualizar dados é criar resumos, calcular estatísticas descritivas que contem informações chave sobre os dados, de maneira concisa.
Estes links tem alguns tutoriais interessantes:
- https://pandas.pydata.org/docs/getting_started/intro_tutorials/06_calculate_statistics.html
- https://www.geeksforgeeks.org/pandas-groupby-summarising-aggregating-and-grouping-data-in-python/
Vamos começar carregando dados:
= pd.read_csv("https://drive.google.com/uc?id=1u2MEH_DTBMyG3clVKA4Q5FEpntLZNKeE")
df = df.drop(df.columns[0], axis=1)
df 'Engine'] = pd.to_numeric(df['Engine'].str.replace(' CC', ''), errors='coerce')
df['Power'] = pd.to_numeric(df['Power'].str.replace(' bhp', ''), errors='coerce')
df[= df.drop(df["Kilometers_Driven"].idxmax())
df df
Name | Location | Year | Kilometers_Driven | Fuel_Type | Transmission | Owner_Type | Mileage | Engine | Power | Seats | New_Price | Price | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Maruti Wagon R LXI CNG | Mumbai | 2010 | 72000 | CNG | Manual | First | 26.6 km/kg | 998.0 | 58.16 | 5.0 | NaN | 1.75 |
1 | Hyundai Creta 1.6 CRDi SX Option | Pune | 2015 | 41000 | Diesel | Manual | First | 19.67 kmpl | 1582.0 | 126.20 | 5.0 | NaN | 12.50 |
2 | Honda Jazz V | Chennai | 2011 | 46000 | Petrol | Manual | First | 18.2 kmpl | 1199.0 | 88.70 | 5.0 | 8.61 Lakh | 4.50 |
3 | Maruti Ertiga VDI | Chennai | 2012 | 87000 | Diesel | Manual | First | 20.77 kmpl | 1248.0 | 88.76 | 7.0 | NaN | 6.00 |
4 | Audi A4 New 2.0 TDI Multitronic | Coimbatore | 2013 | 40670 | Diesel | Automatic | Second | 15.2 kmpl | 1968.0 | 140.80 | 5.0 | NaN | 17.74 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
6014 | Maruti Swift VDI | Delhi | 2014 | 27365 | Diesel | Manual | First | 28.4 kmpl | 1248.0 | 74.00 | 5.0 | 7.88 Lakh | 4.75 |
6015 | Hyundai Xcent 1.1 CRDi S | Jaipur | 2015 | 100000 | Diesel | Manual | First | 24.4 kmpl | 1120.0 | 71.00 | 5.0 | NaN | 4.00 |
6016 | Mahindra Xylo D4 BSIV | Jaipur | 2012 | 55000 | Diesel | Manual | Second | 14.0 kmpl | 2498.0 | 112.00 | 8.0 | NaN | 2.90 |
6017 | Maruti Wagon R VXI | Kolkata | 2013 | 46000 | Petrol | Manual | First | 18.9 kmpl | 998.0 | 67.10 | 5.0 | NaN | 2.65 |
6018 | Chevrolet Beat Diesel | Hyderabad | 2011 | 47000 | Diesel | Manual | First | 25.44 kmpl | 936.0 | 57.60 | 5.0 | NaN | 2.50 |
6018 rows × 13 columns
6.2.1 Sumarisando o dataframe como um todo
Existem algumas funções que combinam várias informações sobre todas as variáveis ao mesmo tempo.
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6019 entries, 0 to 6018
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Name 6019 non-null object
1 Location 6019 non-null object
2 Year 6019 non-null int64
3 Kilometers_Driven 6019 non-null int64
4 Fuel_Type 6019 non-null object
5 Transmission 6019 non-null object
6 Owner_Type 6019 non-null object
7 Mileage 6017 non-null object
8 Engine 5983 non-null float64
9 Power 5876 non-null float64
10 Seats 5977 non-null float64
11 New_Price 824 non-null object
12 Price 6019 non-null float64
dtypes: float64(4), int64(2), object(7)
memory usage: 611.4+ KB
round(3) df.describe().
Year | Kilometers_Driven | Engine | Power | Seats | Price | |
---|---|---|---|---|---|---|
count | 6019.000 | 6019.000 | 5983.000 | 5876.000 | 5977.000 | 6019.000 |
mean | 2013.358 | 58738.380 | 1621.276 | 113.253 | 5.279 | 9.479 |
std | 3.270 | 91268.843 | 601.355 | 53.875 | 0.809 | 11.188 |
min | 1998.000 | 171.000 | 72.000 | 34.200 | 0.000 | 0.440 |
25% | 2011.000 | 34000.000 | 1198.000 | 75.000 | 5.000 | 3.500 |
50% | 2014.000 | 53000.000 | 1493.000 | 97.700 | 5.000 | 5.640 |
75% | 2016.000 | 73000.000 | 1984.000 | 138.100 | 5.000 | 9.950 |
max | 2019.000 | 6500000.000 | 5998.000 | 560.000 | 10.000 | 160.000 |
6.2.2 Sumarisando variáveis categóricas
Para variáveis categóricas sem uma ordem intrínseca, podemos ver a frequência absoluta e relativa de cada categoria.
Exemplo: gênero, estado civil e tipo de produto.
#Frequência abusoluta
= df['Fuel_Type'].value_counts()
counts1
print(counts1)
= "bar") counts1.plot(kind
Fuel_Type
Diesel 3205
Petrol 2746
CNG 56
LPG 10
Electric 2
Name: count, dtype: int64
#Frequência relativa
= df['Owner_Type'].value_counts(normalize = True)
counts2
print(counts2)
= "bar") counts2.plot(kind
Owner_Type
First 0.818877
Second 0.160851
Third 0.018777
Fourth & Above 0.001496
Name: proportion, dtype: float64
6.2.3 Sumarisando variáveis contínuas
Para variáveis que podem assumir qualquer valor dentro da reta real, podemos olhar para a média, mediana, SD.
Exemplo: renda, preço e peso.
print(df['Price'].mean()) # Também existe .sum(), .min(), etc.
'Price'].describe() df[
9.47946835022429
count 6019.000000
mean 9.479468
std 11.187917
min 0.440000
25% 3.500000
50% 5.640000
75% 9.950000
max 160.000000
Name: Price, dtype: float64
De modo mais geral, mas menos mensurável, podemos olhar para a distribuição da variável como um todo com um histograma, e uma visualização simplificada com boxplots.
Histograma: Gráfico que representa a distribuição de uma variável contínua, dividindo os dados em intervalos (ou “bins”) e exibindo a frequência de valores em cada intervalo. É útil para visualizar a forma, dispersão e tendências dos dados, como assimetria e presença de picos.
= df['Engine'].plot.hist(density=True, bins=10, alpha=0.6, label='Histograma')
ax 'Engine'].plot.density(ax=ax, label='Densidade') df[
Boxplot: Gráfico que resume a distribuição de uma variável através de cinco valores-chave: mínimo, primeiro quartil, mediana, terceiro quartil e máximo. Ele é eficaz para identificar outliers, a dispersão dos dados e diferenças entre distribuições de grupos.
'Price'].plot.box() df[
6.2.4 Sumarisando variáveis discretas
Para variáveis que podem assumir valores inteiros específicos, olhamos para a média, moda e frequência
Exemplos: número de filhos, número de produtos vendidos, índice de satisfação de 1 a 5
= df['Year'].value_counts().sort_index()
counts
='bar') counts.plot(kind
print(df['Year'].mean())
print(df['Year'].mode())
2013.3575938850117
0 2014
Name: Year, dtype: int64
print(df['Seats'].mean())
print(df['Seats'].mode())
5.278735151413753
0 5.0
Name: Seats, dtype: float64
6.2.5 Analisando grupos nos dados
Podemos estar interessado em fazer esses resumos mas utilizando grupos nos dados. Veja este tutorial para mais informações.
#Saber a o preço médio de cada tipo
'Transmission')['Price'].mean() df.groupby(
Transmission
Automatic 19.817702
Manual 5.332703
Name: Price, dtype: float64
#Saber o total de cada tipo
'Fuel_Type')['Price'].sum() df.groupby(
Fuel_Type
CNG 196.94
Diesel 41154.14
Electric 25.75
LPG 24.87
Petrol 15655.22
Name: Price, dtype: float64
= 'Price', by = 'Fuel_Type') df.plot.box(column
Price Axes(0.125,0.11;0.775x0.77)
dtype: object
'Fuel_Type').agg({'Price': ['sum', 'mean']}) df.groupby(
Price | ||
---|---|---|
sum | mean | |
Fuel_Type | ||
CNG | 196.94 | 3.516786 |
Diesel | 41154.14 | 12.840605 |
Electric | 25.75 | 12.875000 |
LPG | 24.87 | 2.487000 |
Petrol | 15655.22 | 5.701100 |
'Location').agg({'Price': ['sum', 'mean']}) df.groupby(
Price | ||
---|---|---|
sum | mean | |
Location | ||
Ahmedabad | 1894.44 | 8.457321 |
Bangalore | 4771.65 | 13.328631 |
Chennai | 3830.29 | 7.753623 |
Coimbatore | 9589.75 | 15.078223 |
Delhi | 5378.08 | 9.707726 |
Hyderabad | 7254.20 | 9.776550 |
Jaipur | 2399.21 | 5.809225 |
Kochi | 7277.65 | 11.179186 |
Kolkata | 3028.75 | 5.661215 |
Mumbai | 7449.17 | 9.429329 |
Pune | 4183.73 | 6.726254 |
6.3 BANHEIRO
6.4 Gráficos com o Matplotlib
6.4.1 Anatomia e Estilo de Programação
O Matplotlib exibe seus dados em Figuras (por exemplo, janelas, widgets Jupyter, etc.), cada uma das quais pode conter um ou mais Eixos, uma área onde pontos podem ser especificados em termos de coordenadas x-y (ou theta-r em um gráfico polar, x-y-z em um gráfico 3D, etc.). A maneira mais simples de criar uma Figura com um Eixo é usando pyplot.subplots.
Alguns links úteis:
- https://matplotlib.org/stable/users/explain/quick_start.html.
- https://matplotlib.org/3.8.3/users/index.html.
- https://matplotlib.org/cheatsheets/_images/cheatsheets-1.png.
- https://matplotlib.org/3.8.3/index.html.
- https://matplotlib.org/3.8.3/api/index.html.
6.4.2 Anatomia de uma figura
6.4.3 Plots
- Conteúdo principal do gráfico, ou seja, os dados que queremos visualizar
- A escolha de gráfico para plotar vai depender do tipo de dado que temos e do que queremos comunicar
Tipos de gráficos: - Bar Plot: comparar categorias diferentes, principalmente com dados categóricos ou discretos. Funciona para mostrar a frequência e contagem dos valores - Scatter Plot: mostrar relação entre duas variáveis contínuas, principalmente para observar padrões, tendências e correlações entre duas variáveis - Line Plot: observar mudanças ao longo do tempo de séries de temporais, principalmente para análises de tendência e sazonalidades - Histograma: visualizar a distribuição de uma variável contínua agrupando dados em intervalos e mostra quantos dados caem em cada intervalo - Boxplot: resumir a distribuição de uma variável e destacar valores atípico, principalmente para comparar a distribuição entre várias categorias - Pie Plot: mostrar proporções ou porcentagem entre categorias - Heatmap: visualizar variáveis categóricas ou contínuas em formato de matriz, usando cores para mostrar intensidade ou frequênciacia
6.4.4 Estéticas
- elementos visuais diretamente ligados aos dados
- ajudam a distinguir e interpretar diferentes partes do gráfico
- propósito de destacar os dados de forma intuitiva
- cor dos pontos ou barras, formato e tamanho dos marcadores e espessura das linhas
6.4.5 Tema
- apresentação geral do gráfico,
- tudo que não está diretamente relacionado aos dados, mas que torna o gráfico mais legível e organizado
- título, rótulos dos eixos, fundo, grid, legenda
6.4.6 O estilo da programação
import matplotlib.pyplot as plt
import numpy as np
= np.linspace(0, 2, 100) # Sample data.
x
# Note that even in the OO-style, we use `.pyplot.figure` to create the Figure.
= plt.subplots(figsize=(5, 2.7))
fig, ax ='linear') # Plot some data on the axes.
ax.plot(x, x, label**2, label='quadratic') # Plot more data on the axes...
ax.plot(x, x**3, label='cubic') # ... and some more.
ax.plot(x, x'x label') # Add an x-label to the axes.
ax.set_xlabel('y label') # Add a y-label to the axes.
ax.set_ylabel("Simple Plot") # Add a title to the axes.
ax.set_title(# Add a legend. ax.legend()
6.4.7 Plots Combinados
# Gerando dados fictícios para os gráficos
= np.linspace(0, 10, 100)
x = np.sin(x)
y1 = np.cos(x)
y2 = np.tan(x)
y3 = np.exp(x / 10)
y4
# Criando uma matriz de 2x2 subgráficos
= plt.subplots(2, 2, figsize=(10, 8))
fig, axes
# Primeiro gráfico
0, 0].plot(x, y1, 'r')
axes[0, 0].set_title('Seno')
axes[
# Segundo gráfico
0, 1].plot(x, y2, 'b')
axes[0, 1].set_title('Cosseno')
axes[
# Terceiro gráfico
1, 0].plot(x, y3, 'g')
axes[1, 0].set_ylim(-10, 10) # Limitando o eixo y para evitar valores muito grandes
axes[1, 0].set_title('Tangente')
axes[
# Quarto gráfico
1, 1].plot(x, y4, 'm')
axes[1, 1].set_title('Exponencial')
axes[
# Ajustar o layout para evitar sobreposição
plt.tight_layout()
# Exibir o gráfico
plt.show()
= plt.subplots(2, 2, figsize=(12, 8))
fig, axs
# Histograma da quilometragem
0, 0].hist(df['Kilometers_Driven'], bins=10, color='lightcoral', edgecolor='darkred', alpha=0.7)
axs[0, 0].set_title('Histograma da Quilometragem', fontsize=14, fontweight='bold')
axs[0, 0].set_xlabel('Quilometragem', fontsize=12, color='darkred')
axs[0, 0].set_ylabel('Frequência', fontsize=12, color='darkred')
axs[0, 0].tick_params(axis='both', colors='darkred')
axs[0, 0].grid(color='grey', linestyle='--', linewidth=0.5, alpha=1)
axs[
# Gráfico de linhas com soma de vendas
0, 1].plot(
axs["Year")["Price"].sum().index,
df.groupby("Year")["Price"].sum().values,
df.groupby(='*', linestyle=':', color='navy', markersize=6, label='Total de Vendas'
marker
)0, 1].set_title('Soma das Vendas por Ano', fontsize=14, fontweight='bold', fontstyle='italic')
axs[0, 1].set_xlabel('Ano', fontsize=12, color='navy')
axs[0, 1].set_ylabel('Valores', fontsize=12, color='navy')
axs[0, 1].legend(loc='upper left', frameon=False)
axs[0, 1].tick_params(axis='x', colors='darkred', rotation=45)
axs[0, 1].tick_params(axis='y', colors='teal')
axs[0, 1].grid(color='grey', linestyle=':', linewidth=1, alpha=1)
axs[
# Scatter plot de Ano vs. Quilometragem
1, 0].scatter(df['Year'], df['Kilometers_Driven'], color='purple', edgecolor='black', s=70, alpha=0.6, marker='v')
axs[1, 0].set_title('Ano vs. Quilometragem', fontsize=14)
axs[1, 0].set_xlabel('Ano', fontsize=12, color='darkgreen')
axs[1, 0].set_ylabel('Quilometragem', fontsize=12, color='purple')
axs[1, 0].tick_params(axis='x', colors='purple', rotation=45)
axs[1, 0].tick_params(axis='y', colors='purple')
axs[1, 0].grid(color='lavender', linestyle=':', linewidth=0.1, alpha=0.5)
axs[
# Gráfico de barras da quantidade de tipo de motor
1, 1].bar(df['Fuel_Type'].value_counts().index, df['Fuel_Type'].value_counts().values, color='dodgerblue', edgecolor='black', hatch='/')
axs[1, 1].set_title('Tipo de Motor', fontsize=14, fontweight='bold')
axs[1, 1].set_xlabel('Tipo do motor', fontsize=12, color='dodgerblue')
axs[1, 1].set_ylabel('Quantidade', fontsize=12)
axs[
# Ajuste do layout
plt.tight_layout() plt.show()
6.5 Extras
Principais paramêtros:
- color: cor
- linewidth: espessura da linha
- width: largura da barra
- linestyle: tipo de linha
- marker: símbolo nos pontos
- markersize: tamanho do símbolo
- label: legenda da série
- s: tamanho de cada ponto
- alpha: controle de transparência
- edgecolor: cor da borda
- hatch: preencimento da barra
- bins: número de intervalos para os dados
- autopct: formato para exibir os valores percentuais
- strangle: ângulo de rocação inicial do gráfcio
- explode: destaca fatias específicas
- cmap: mapa de cores
- Tipos de Linhas (linestyle)
- ‘-’: Linha contínua (padrão).
- ‘–’: Linha tracejada.
- ‘-.’: Linha traço-ponto.
- ‘:’: Linha pontilhada.
- ’’ ou ‘None’: Sem linha (exibe apenas os marcadores).
- Cores (color)
- Nomes de cores: ‘blue’, ‘red’, ‘green’, ‘purple’, ‘orange’, etc.
- Códigos Hexadecimais: ‘#1f77b4’, ‘#ff7f0e’, etc.
- Mapas de Cores (Colormaps): Paletas usadas para gradientes, como ‘viridis’, ‘plasma’, ‘coolwarm’, etc.
- Marcadores (marker)
- ‘o’: Círculo
- ‘s’: Quadrado
- ‘^’: Triângulo para cima
- ‘v’: Triângulo para baixo
- ‘D’: Losango
- ’*’: Estrela
- ‘+’: Cruz
- ‘x’: X
6.5.1 Outros
Biblioteca seaborn para criar gráficos mais complexos de maneira mais fácil: https://seaborn.pydata.org/
Biblioteca plotline para criar gráfico dinâmica e interativos: https://plotnine.org/
#Gráfico 1
# Criar uma figura com uma grade de 2 linhas e 3 colunas
= plt.subplots(2, 3, figsize=(15, 8)) # figsize ajusta o tamanho total da figura
fig, axs
# 1. Gráfico de Barras
= ['A', 'B', 'C', 'D']
categorias = [50, 30, 20, 40]
vendas 0, 0].bar(categorias, vendas, color='skyblue', edgecolor='black')
axs[
# 2. Gráfico de Dispersão
= [20, 25, 30, 35, 40]
idades1 = [65, 70, 75, 80, 85]
pesos1 = [22, 27, 32, 37, 42]
idades2 = [68, 73, 78, 83, 88]
pesos2 0, 1].scatter(idades1, pesos1, color='purple', edgecolor='black', marker='o', label="Grupo 1")
axs[0, 1].scatter(idades2, pesos2, color='purple', edgecolor='black', marker='o', label="Grupo 2")
axs[
# 3. Gráfico de Linhas
= ['A', 'B', 'C', 'D', 'E', 'F', 'G']
dias = [18, 20, 22, 21, 19, 17, 18]
temperaturas1 = [19, 21, 23, 22, 20, 18, 19]
temperaturas2 0, 2].plot(dias, temperaturas1, marker='o', color='orange', linestyle='-', label="Série 1")
axs[0, 2].plot(dias, temperaturas2, marker='o', color='orange', linestyle='-', label="Série 2")
axs[
# 4. Histograma
= [22, 22, 23, 24, 25, 25, 26, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 34]
idades_hist 1, 0].hist(idades_hist, bins=5, color='lightgreen', edgecolor='black')
axs[
# 5. Gráfico de Pizza
= ['A', 'B', 'C', 'D']
regioes = [300, 500, 200, 400]
vendas_pizza 1, 1].pie(vendas_pizza, labels=regioes, autopct='%1.1f%%', startangle=140,
axs[=['#ff9999','#ff9999','#ff9999','#ff9999'])
colors
# 6. Heatmap (Matriz de Correlação)
= np.array([[1, 0.8, 0.3],
dados 0.8, 1, 0.5],
[0.3, 0.5, 1]])
[= axs[1, 2].imshow(dados, cmap='viridis', aspect='auto')
im
# Ajuste de layout
plt.tight_layout()
# Salvar a figura sem mostrar na tela
#plt.savefig("grafico1.png", dpi=300)
plt.show()#plt.close()
#Gráfico 2
# Criar uma figura com uma grade de 2 linhas e 3 colunas
= plt.subplots(2, 3, figsize=(15, 8))
fig, axs
# 1. Gráfico de Barras com cores diferentes para cada barra
= ['A', 'B', 'C', 'D']
categorias = [50, 30, 20, 40]
vendas = ['skyblue', 'salmon', 'lightgreen', 'gold']
cores 0, 0].bar(categorias, vendas, color=cores, edgecolor='black')
axs[
# 2. Gráfico de Dispersão com dois grupos de dados, cores e formatos diferentes
= [20, 25, 30, 35, 40]
idades1 = [65, 70, 75, 80, 85]
pesos1 = [22, 27, 32, 37, 42]
idades2 = [68, 73, 78, 83, 88]
pesos2 0, 1].scatter(idades1, pesos1, color='purple', edgecolor='black', marker='o', label="Grupo 1")
axs[0, 1].scatter(idades2, pesos2, color='blue', edgecolor='black', marker='s', label="Grupo 2")
axs[
# 3. Gráfico de Linhas com duas séries temporais e estilos de linha diferentes
= ['A', 'B', 'C', 'D', 'E', 'F', 'G']
dias = [18, 20, 22, 21, 19, 17, 18]
temperaturas1 = [19, 21, 23, 22, 20, 18, 19]
temperaturas2 0, 2].plot(dias, temperaturas1, marker='o', color='orange', linestyle='-', label="Série 1")
axs[0, 2].plot(dias, temperaturas2, marker='s', color='green', linestyle='--', label="Série 2")
axs[
# 4. Histograma com diferentes estilos de borda
= [22, 22, 23, 24, 25, 25, 26, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 34]
idades_hist 1, 0].hist(idades_hist, bins=5, color='lightgreen', edgecolor='darkgreen', hatch='//')
axs[
# 5. Gráfico de Pizza com diferentes ângulos de início e explosão de fatia
= ['A', 'B', 'C', 'D']
regioes = [300, 500, 200, 400]
vendas_pizza = (0, 0.1, 0, 0) # Explodindo a segunda fatia
explode 1, 1].pie(vendas_pizza, labels=regioes, autopct='%1.1f%%', startangle=140, explode=explode,
axs[=['#ff9999','#66b3ff','#99ff99','#ffcc99'])
colors
# 6. Heatmap (Matriz de Correlação) com rótulos e barra de cor ajustada
= np.array([[1, 0.8, 0.3],
dados 0.8, 1, 0.5],
[0.3, 0.5, 1]])
[= axs[1, 2].imshow(dados, cmap='coolwarm', aspect='auto')
im =axs[1, 2], fraction=0.046, pad=0.04)
fig.colorbar(im, ax
# Ajuste de layout
# Salvar a figura sem mostrar na tela
#plt.savefig("grafico2.png", dpi=300)
plt.show()#plt.close()
#Gráfico 3
# Criar uma figura com uma grade de 2 linhas e 3 colunas
= plt.subplots(2, 3, figsize=(15, 10))
fig, axs
# 1. Gráfico de Barras com cores diferentes para cada barra
= ['A', 'B', 'C', 'D']
categorias = [50, 30, 20, 40]
vendas = ['skyblue', 'salmon', 'lightgreen', 'gold']
cores 0, 0].bar(categorias, vendas, color=cores, edgecolor='black')
axs[0, 0].set_title("Vendas por Categoria")
axs[0, 0].set_xlabel("Categorias")
axs[0, 0].set_ylabel("Vendas")
axs[
# 2. Gráfico de Dispersão com dois grupos de dados, cores e formatos diferentes
= [20, 25, 30, 35, 40]
idades1 = [65, 70, 75, 80, 85]
pesos1 = [22, 27, 32, 37, 42]
idades2 = [68, 73, 78, 83, 88]
pesos2 0, 1].scatter(idades1, pesos1, color='purple', edgecolor='black', marker='o', label="Homens")
axs[0, 1].scatter(idades2, pesos2, color='blue', edgecolor='black', marker='s', label="Mulheres")
axs[0, 1].set_title("Idade vs Peso")
axs[0, 1].set_xlabel("Idade")
axs[0, 1].set_ylabel("Peso (kg)")
axs[0, 1].legend()
axs[
# 3. Gráfico de Linhas com duas séries temporais e estilos de linha diferentes
= ['A', 'B', 'C', 'D', 'E', 'F', 'G']
dias = [18, 20, 22, 21, 19, 17, 18]
temperaturas1 = [19, 21, 23, 22, 20, 18, 19]
temperaturas2 0, 2].plot(dias, temperaturas1, marker='o', color='orange', linestyle='-', label="Série 1")
axs[0, 2].plot(dias, temperaturas2, marker='s', color='green', linestyle='--', label="Série 2")
axs[0, 2].set_title("Temperatura Semanal")
axs[0, 2].set_xlabel("Dias")
axs[0, 2].set_ylabel("Temperatura (°C)")
axs[0, 2].legend()
axs[
# 4. Histograma com diferentes estilos de borda
= [22, 22, 23, 24, 25, 25, 26, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 34]
idades_hist 1, 0].hist(idades_hist, bins=5, color='lightgreen', edgecolor='darkgreen', hatch='//')
axs[1, 0].set_title("Distribuição de Idades")
axs[1, 0].set_xlabel("Idade")
axs[1, 0].set_ylabel("Frequência")
axs[
# 5. Gráfico de Pizza com diferentes ângulos de início e explosão de fatia
= ['A', 'B', 'C', 'D']
regioes = [300, 500, 200, 400]
vendas_pizza = (0, 0.1, 0, 0) # Explodindo a segunda fatia
explode 1, 1].pie(vendas_pizza, labels=regioes, autopct='%1.1f%%', startangle=140, explode=explode,
axs[=['#ff9999','#66b3ff','#99ff99','#ffcc99'])
colors1, 1].set_title("Vendas por Região")
axs[
# 6. Heatmap (Matriz de Correlação) com rótulos e barra de cor ajustada
= np.array([[1, 0.8, 0.3],
dados 0.8, 1, 0.5],
[0.3, 0.5, 1]])
[= axs[1, 2].imshow(dados, cmap='coolwarm', aspect='auto')
im 1, 2].set_title("Heatmap de Correlação")
axs[1, 2].set_xticks(range(3))
axs[1, 2].set_yticks(range(3))
axs[1, 2].set_xticklabels(['Var1', 'Var2', 'Var3'])
axs[1, 2].set_yticklabels(['Var1', 'Var2', 'Var3'])
axs[=axs[1, 2], fraction=0.046, pad=0.04)
fig.colorbar(im, ax
# Ajuste de layout
# Salvar a figura sem mostrar na tela
#plt.savefig("grafico3.png", dpi=300)
plt.show()#plt.close()