11.5 Gráficos de séries temporais

11.5.1 ts

Veja ?plot.ts.

# série univariada
plot(zm1[,1])

# séries separadas
plot(zm1)

# séries sobrepostas
plot(zm1, plot.type = 'single', lty = 1:3)

# séries sobrepostas
ggplot2::autoplot(zm1)

# ggplot2::autoplot(zm1, facets = NULL) # não funciona com ts()

Exemplo 11.20 Em Python.

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

# Redefinindo zm1 (apenas para garantir que ele esteja definido)
np.random.seed(99)
data = np.random.randn(300).reshape(100, 3)
index = pd.date_range(start='2015-01-01', periods=100, freq='MS')
zm1 = pd.DataFrame(data, index=index, columns=['Série 1', 'Série 2', 'Série 3'])  # Nomeando as colunas

# Série univariada
plt.figure(figsize=(10, 6))
plt.plot(zm1.index, zm1.iloc[:, 0])  # Plota a primeira coluna
plt.title('Série Univariada')
plt.xlabel('Tempo')
plt.ylabel('Valor')
plt.show()

# Séries separadas
zm1.plot(subplots=True, figsize=(10, 8))
plt.suptitle('Séries Separadas')
plt.show()

# Séries sobrepostas
plt.figure(figsize=(10, 6))
for column in zm1.columns:
    plt.plot(zm1.index, zm1[column], label=column)
plt.title('Séries Sobrepostas')
plt.xlabel('Tempo')
plt.ylabel('Valor')
plt.legend()
plt.show()

# Séries sobrepostas (com seaborn)
plt.figure(figsize=(10, 6))
sns.lineplot(data=zm1)
plt.title('Séries Sobrepostas (Seaborn)')
plt.show()

# Séries sobrepostas (ggplot2 - tentativa)
try:
    from plotnine import ggplot, aes, geom_line, labs

    zm1_reset = zm1.reset_index().melt(id_vars='index', var_name='series', value_name='value')
    plot_ggplot = (ggplot(zm1_reset, aes(x='index', y='value', color='series')) +
                   geom_line() +
                   labs(title='Séries Sobrepostas (ggplot2)')
                   )
    print(plot_ggplot)
except ImportError:
    print('plotnine não instalado, pulando a plotagem estilo ggplot2.')

11.5.2 zoo

Veja ?plot.zoo.

# série univariada
plot(zm2[,1])

# séries separadas
plot(zm2)

# séries sobrepostas
plot(zm2, plot.type = 'single', lty = 1:3)

# séries separadas
ggplot2::autoplot(zm2)

# ggplot2::autoplot(zm2, facets = NULL) # séries sobrepostas

Exemplo 11.21 Em Python.

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

# Redefinindo zm2 (apenas para garantir que ele esteja definido)
np.random.seed(99)
data = np.random.randn(300).reshape(100, 3)
index = pd.date_range(start='2015-01-01', periods=100, freq='MS')
zm2 = pd.DataFrame(data, index=index, columns=['Série 1', 'Série 2', 'Série 3'])

# Série univariada
plt.figure(figsize=(10, 6))
plt.plot(zm2.index, zm2.iloc[:, 0])  # Plota a primeira coluna
plt.title('Série Univariada')
plt.xlabel('Tempo')
plt.ylabel('Valor')
plt.show()

# Séries separadas
zm2.plot(subplots=True, figsize=(10, 8))
plt.suptitle('Séries Separadas')
plt.show()

# Séries sobrepostas
plt.figure(figsize=(10, 6))
for i, column in enumerate(zm2.columns):
    plt.plot(zm2.index, zm2[column], label=column, linestyle='-' if i % 2 == 0 else '--')
plt.title('Séries Sobrepostas')
plt.xlabel('Tempo')
plt.ylabel('Valor')
plt.legend()
plt.show()

# Séries separadas (ggplot2 - tentativa)
try:
    from plotnine import ggplot, aes, geom_line, labs, facet_wrap

    zm2_reset = zm2.reset_index().melt(id_vars='index', var_name='series', value_name='value')
    plot_ggplot = (ggplot(zm2_reset, aes(x='index', y='value')) +
                   geom_line() +
                   facet_wrap('series', ncol=1) +  # Separa as séries em painéis
                   labs(title='Séries Separadas (ggplot2)')
                   )
    print(plot_ggplot)
except ImportError:
    print('plotnine não instalado, pulando a plotagem estilo ggplot2.')

11.5.3 xts

Veja ?plot.xts.

# série univariada
plot(zm3[,1])

# séries separadas
plot(zm3, multi.panel = TRUE)

# séries sobrepostas
plot(zm3)

# séries separadas
ggplot2::autoplot(zm3)

# ggplot2::autoplot(zm3, facets = NULL) # séries sobrepostas

Exemplo 11.22 Em Python.

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

# Redefinindo zm3 (apenas para garantir que ele esteja definido)
np.random.seed(99)
data = np.random.randn(300).reshape(100, 3)
index = pd.date_range(start='2015-01-01', periods=100, freq='MS')
zm3 = pd.DataFrame(data, index=index, columns=['Série 1', 'Série 2', 'Série 3'])

# Série univariada
plt.figure(figsize=(10, 6))
plt.plot(zm3.index, zm3.iloc[:, 0])  # Plota a primeira coluna
plt.title('Série Univariada')
plt.xlabel('Tempo')
plt.ylabel('Valor')
plt.show()

# Séries separadas (multi.panel = TRUE)
zm3.plot(subplots=True, figsize=(10, 8))
plt.suptitle('Séries Separadas')
plt.show()

# Séries sobrepostas
plt.figure(figsize=(10, 6))
sns.lineplot(data=zm3)
plt.title('Séries Sobrepostas (Seaborn)')
plt.show()

# Séries separadas (ggplot2 - tentativa)
try:
    from plotnine import ggplot, aes, geom_line, labs, facet_wrap

    zm3_reset = zm3.reset_index().melt(id_vars='index', var_name='series', value_name='value')
    plot_ggplot = (ggplot(zm3_reset, aes(x='index', y='value')) +
                   geom_line() +
                   facet_wrap('series', ncol=1) +  # Separa as séries em painéis
                   labs(title='Séries Separadas (ggplot2)')
                   )
    print(plot_ggplot)
except ImportError:
    print('plotnine não instalado, pulando a plotagem estilo ggplot2.')

11.5.4 tsibble

Via tsibble.

library(ggplot2)
library(feasts)
zm4 %>%
  dplyr::filter(key == 'Series 1') %>%
  ggplot2::autoplot(value) # série univariada

ggplot2::autoplot(zm4, value) +
  facet_grid(key ~ .) # séries separadas verticalmente

ggplot2::autoplot(zm4, value) +
  facet_grid(. ~ key) # séries separadas horizontalmente

ggplot2::autoplot(zm4, value) # séries sobrepostas

Exemplo 11.23 Em Python.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from plotnine import ggplot, aes, geom_line, facet_grid, labs, facet_wrap  # Importando facet_wrap

# Redefinindo zm4 (apenas para garantir que ele esteja definido e no formato correto)
np.random.seed(99)
data = np.random.randn(300).reshape(100, 3)
index = pd.date_range(start='2015-01-01', periods=100, freq='MS')
zm4 = pd.DataFrame(data, index=index, columns=['Series 1', 'Series 2', 'Series 3'])
zm4 = zm4.reset_index().melt(id_vars='index', var_name='key', value_name='value')


# zm4 %>% dplyr::filter(key == 'Series 1') %>% ggplot2::autoplot(value) # série univariada
zm4_series1 = zm4[zm4['key'] == 'Series 1']
plot_series1 = (ggplot(zm4_series1, aes(x='index', y='value')) +
                geom_line() +
                labs(title='Série Univariada (Series 1)'))
print(plot_series1)

# ggplot2::autoplot(zm4, value) + facet_grid(key ~ .) # séries separadas verticalmente
plot_facet_vertical = (ggplot(zm4, aes(x='index', y='value')) +
                        geom_line() +
                        facet_grid('key ~ .') +
                        labs(title='Séries Separadas (Vertical)'))
print(plot_facet_vertical)

# ggplot2::autoplot(zm4, value) + facet_grid(. ~ key) # séries separadas horizontalmente
plot_facet_horizontal = (ggplot(zm4, aes(x='index', y='value')) +
                          geom_line() +
                          facet_grid('. ~ key') +
                          labs(title='Séries Separadas (Horizontal)'))
print(plot_facet_horizontal)

# ggplot2::autoplot(zm4, value) # séries sobrepostas
plot_overlaid = (ggplot(zm4, aes(x='index', y='value', color='key')) +
                 geom_line() +
                 labs(title='Séries Sobrepostas'))
print(plot_overlaid)

# ggplot2::autoplot(zm4, value) + facet_wrap(key) # Series separadas por facet_wrap
plot_facet_wrap = (ggplot(zm4, aes(x='index', y='value')) +
                        geom_line() +
                        facet_wrap('key') +
                        labs(title='Séries Separadas (Facet Wrap)'))
print(plot_facet_wrap)

11.5.5 TSstudio

TSstudio (Krispin 2023) fornece um conjunto de ferramentas para análise descritiva e preditiva de dados de séries temporais. Inclui funções para visualização interativa de objetos de séries temporais baseadas em plotly (Sievert 2020) e também funções para automação de previsão de séries temporais.

library(TSstudio)
ts_plot(zm1[,1]) # série univariada
ts_plot(zm1, type = 'multiple') # séries separadas
ts_plot(zm1) # séries sobrepostas

Exemplo 11.24 Em Python.

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

# Redefinindo zm1 (apenas para garantir que ele esteja definido)
np.random.seed(99)
data = np.random.randn(300).reshape(100, 3)
index = pd.date_range(start='2015-01-01', periods=100, freq='MS')
zm1 = pd.DataFrame(data, index=index, columns=['Série 1', 'Série 2', 'Série 3'])

# ts_plot(zm1[,1]) # série univariada
plt.figure(figsize=(10, 6))
plt.plot(zm1.index, zm1['Série 1'])
plt.title('Série Univariada (Série 1)')
plt.xlabel('Tempo')
plt.ylabel('Valor')
plt.show()

# ts_plot(zm1, type = 'multiple') # séries separadas
zm1.plot(subplots=True, figsize=(10, 8))
plt.suptitle('Séries Separadas')
plt.show()

# ts_plot(zm1) # séries sobrepostas
plt.figure(figsize=(10, 6))
sns.lineplot(data=zm1)
plt.title('Séries Sobrepostas')
plt.xlabel('Tempo')
plt.ylabel('Valor')
plt.show()

Exercício 11.9 Leia a seguinte documentação.

  1. Plotting Time Series Data.

11.5.6 Gráficos sazonais

A função stats::monthplot() representa subséries sazonais de uma série temporal. Para cada temporada (ou outra categoria), é traçada uma série temporal. Esta função e suas correlatas extraem subséries de uma série temporal plotando-as em um quadro. Os métodos ts, stl e StructTS usam a frequência registrada internamente e os horários de início e término para definir a escala e as temporadas.

library(fpp2)
stats::monthplot(h02)

Exemplo 11.25 Em Python.

import matplotlib.pyplot as plt
import pandas as pd
from statsmodels.datasets import co2

# Carregando o conjunto de dados co2 (equivalente a h02 em fpp2)
data = co2.load_pandas().data
data.index = data.index.to_period('M')  # Convertendo o índice para períodos mensais

# Calculando a média mensal
monthly_avg = data.groupby(data.index.month)['co2'].mean()

# Plotando o gráfico de médias mensais
plt.figure(figsize=(10, 6))
plt.bar(monthly_avg.index, monthly_avg.values)
plt.title('Gráfico de Médias Mensais (CO2)')
plt.xlabel('Mês')
plt.ylabel('Média Mensal de CO2')
plt.xticks(monthly_avg.index)  # Definindo os ticks do eixo x como os meses
plt.show()

A função forecast::ggseasonplot() traça um gráfico sazonal conforme descrito na Seção 2.4 de (Rob J. Hyndman and Athanasopoulos 2021). É como um gráfico temporal, exceto que os dados são plotados em relação aos períodos em anos separados.

library(fpp2)
forecast::ggseasonplot(h02, col=rainbow(12), year.labels = TRUE)

Exemplo 11.26 Em Python.

import matplotlib.pyplot as plt
import pandas as pd
from statsmodels.datasets import co2

# Carregando o conjunto de dados co2 (equivalente a h02 em fpp2)
data = co2.load_pandas().data
data.index = data.index.to_period('M')

# Criando um DataFrame com as colunas 'Year' e 'Month'
df = pd.DataFrame({
    'Year': data.index.year,
    'Month': data.index.month,
    'CO2': data['co2']
})

# Plotando o gráfico sazonal
fig, axes = plt.subplots(1, 1, figsize=(10, 6), sharex=True)
for year in df['Year'].unique():
    df_year = df[df['Year'] == year]
    axes.plot(df_year['Month'], df_year['CO2'], label=year)
axes.set_title('Gráfico Sazonal (CO2)')
axes.set_xlabel('Mês')
axes.set_ylabel('CO2')
axes.legend(title='Ano')
plt.show()

References

———. 2021. Forecasting: Principles and Practice, 3rd Ed. OTexts. https://otexts.com/fpp3/.
Krispin, Rami. 2023. TSstudio: Functions for Time Series Analysis and Forecasting. https://CRAN.R-project.org/package=TSstudio.
Sievert, Carson. 2020. Interactive Web-Based Data Visualization with r, Plotly, and Shiny. Chapman; Hall/CRC. https://plotly-r.com.