- A pergunta e a referência
- Fontes de dados
- Por que estes dois conjuntos
- Pré-processamento e suavização
- Código: gráfico de sobreposição (overlay)
- Como reproduzir
- Limitações e ressalvas
- Pontos frágeis desta demonstração
1. A pergunta e a referência
Existe alguma relação visual entre a atividade solar reconstruída e a temperatura da Groenlândia ao longo do Holoceno (últimos ~11.400 anos)? A pergunta aparece na Parte 3 do post O Cientista que desconhecia o método como contraponto à afirmação de que, retirada a "ciclicidade", o sinal climático seria uma tendência monotônica industrial. Antes de retirar ciclos, é útil enxergá-los — e o Holoceno é o intervalo onde temos as melhores reconstruções proxy de longo prazo.
Este tutorial documenta como o gráfico foi construído: dois eixos verticais, mesma escala temporal, ambas as séries suavizadas com média móvel de 200 anos. Não tenta provar correlação estatística — mostra apenas o que se vê quando as duas curvas são colocadas lado a lado.
2. Fontes de dados
Duas séries proxy públicas e amplamente citadas, ambas hospedadas pelo NOAA Paleoclimatology Program.
Arquivo: solanki2004-ssn.txt
Arquivo: gisp2_temp_accum_alley2000.txt
Os arquivos são salvos em Data/climate/solanki2004_sunspots.txt e Data/climate/gisp2_temp_alley2000.txt dentro do projeto Plotter.
3. Por que estes dois conjuntos
A escolha não é arbitrária. Para um intervalo de ~11.000 anos, há essencialmente duas categorias de proxies bem-resolvidas: testemunhos de gelo polar (temperatura via isótopos) e indicadores cosmogênicos (atividade solar via 14C ou 10Be). Solanki 2004 é a reconstrução solar de referência para o Holoceno; GISP2/Alley 2000 é a curva de temperatura mais citada para o mesmo período. Ambas têm resolução temporal compatível (década a duas décadas), o que torna a sobreposição em uma única figura sensata.
É preciso registrar uma ressalva imediata: GISP2 é uma localização (Summit, Groenlândia central). Não é o termômetro do planeta. Solanki é uma reconstrução global da atividade solar. Comparar uma série local com um forçante global pressupõe que a Groenlândia central responde proporcionalmente ao forçante solar — o que é defensável como hipótese de trabalho, não como teorema.
4. Pré-processamento e suavização
Os dados de Solanki estão em intervalos de 10 anos; GISP2 tem espaçamento variável, com média de aproximadamente 20 anos perto do presente. Para colocar as duas curvas em escala visual comparável, aplicamos uma média móvel de 200 anos a cada série — 20 pontos para Solanki, 10 pontos para GISP2. A janela de 200 anos é uma escolha de comunicação, não estatística: mostra ciclos centenários sem afogar a figura em ruído de alta frequência.
Filtramos o intervalo Holoceno (0 a 11.400 BP) e plotamos com o eixo X de 10.000 a 0 — passado à esquerda, presente à direita.
5. Código: gráfico de sobreposição (overlay)
Script em scripts/climate/plot_sunspots_temp_overlay.py. As partes essenciais:
"""
Solanki 2004 sunspot reconstruction vs GISP2 temperature (Alley 2000).
Dual-axis overlay over the Holocene, both series with 200-yr running mean.
"""
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
# --- Load Solanki sunspot data (10-yr intervals) ---
sunspots = pd.read_csv(
"Data/climate/solanki2004_sunspots.txt",
skiprows=71, sep=r"\s+", names=["year_bp", "sunspot_number", "sigma"],
encoding="latin-1",
)
# --- Load GISP2 temperature (variable spacing, ~20 yr near present) ---
temp = pd.read_csv(
"Data/climate/gisp2_temp_alley2000.txt",
skiprows=75, nrows=1632, sep=r"\s+", names=["age_kyr_bp", "temp_c"],
encoding="latin-1",
)
temp["year_bp"] = temp.age_kyr_bp * 1000 # kyr -> yr
# Keep Holocene only
sunspots = sunspots[(sunspots.year_bp >= 0) & (sunspots.year_bp <= 11400)].copy()
temp = temp[(temp.year_bp >= 0) & (temp.year_bp <= 11400)].copy()
# 200-yr running mean (Solanki: 20 points; GISP2: 10 points)
sunspots["sn_smooth"] = sunspots.sunspot_number.rolling(
window=20, center=True, min_periods=5).mean()
temp["temp_smooth"] = temp.temp_c.rolling(
window=10, center=True, min_periods=3).mean()
# --- Dual-axis overlay ---
fig, ax1 = plt.subplots(figsize=(16, 6))
color_sun = "#E69F00"
color_temp = "#2166AC"
# Sunspot (left axis)
ax1.plot(sunspots.year_bp, sunspots.sn_smooth,
color=color_sun, alpha=0.9, linewidth=1.2)
ax1.set_ylabel("Reconstructed Sunspot Number\n(200-yr running mean)",
color=color_sun, fontsize=12, fontweight="bold")
ax1.tick_params(axis="y", labelcolor=color_sun)
ax1.set_xlim(10000, 0) # past on left, present on right
ax1.grid(True, alpha=0.3)
# Temperature (right axis)
ax2 = ax1.twinx()
ax2.plot(temp.year_bp, temp.temp_smooth,
color=color_temp, alpha=0.9, linewidth=1.2)
ax2.set_ylabel("Air Temperature (°C)\nGISP2, Greenland",
color=color_temp, fontsize=12, fontweight="bold")
ax2.tick_params(axis="y", labelcolor=color_temp)
ax2.set_ylim(-33.5, -28.5) # warmer at top
# X-axis
ax1.set_xlabel("Years Before Present", fontsize=12)
ax1.xaxis.set_major_locator(ticker.MultipleLocator(1000))
ax1.xaxis.set_minor_locator(ticker.MultipleLocator(250))
# Title
fig.suptitle(
"Solar Activity vs Greenland Temperature — Holocene",
fontsize=15, fontweight="bold", y=0.98,
)
ax1.set_title(
"Solanki et al. (2004) sunspot reconstruction (200-yr smooth) | "
"GISP2 temperature (Alley 2000)",
fontsize=9, color="gray", pad=4,
)
fig.tight_layout()
fig.savefig(
"plots/Be10 and O18/sunspots_vs_temp_holocene_overlay_200yr_v2.png",
dpi=200, bbox_inches="tight",
)
6. Como reproduzir
# Pré-requisitos
pip install pandas matplotlib
# Estrutura esperada (ja existe no repo Plotter)
Plotter/
+-- Data/
| +-- climate/
| +-- solanki2004_sunspots.txt
| +-- gisp2_temp_alley2000.txt
+-- scripts/
| +-- climate/
| +-- plot_sunspots_temp_overlay.py
+-- plots/
+-- Be10 and O18/
# Executar a partir da raiz do projeto
cd Plotter
python scripts/climate/plot_sunspots_temp_overlay.py
# Saida gerada:
# plots/Be10 and O18/sunspots_vs_temp_holocene_overlay_200yr_v2.png7. Limitações e ressalvas
- Eixos independentes não implicam relação 1:1. Os eixos esquerdo e direito têm escalas escolhidas para caber visualmente; isso amplifica ou comprime amplitudes relativas. A figura é uma sobreposição visual, não uma regressão.
- Esta demonstração não testa causalidade. Não calculamos correlação cruzada, defasagem, espectro de potência ou qualquer estatística formal. O propósito é mostrar a presença de ciclicidade — não atribuir parte do sinal de temperatura à variabilidade solar.
8. Pontos frágeis desta demonstração
Em revisão crítica, três pontos da metodologia merecem ser explicitados — não para invalidar a figura, mas para que ninguém a interprete além do que ela diz.
8.1 A janela de 200 anos é uma escolha de apresentação
Janelas mais curtas (50 anos) deixam o ruído visível e dificultam a leitura; janelas mais longas (500 anos, como na primeira versão deste gráfico) suavizam ciclos centenários reais. Os 200 anos foram escolhidos porque preservam aproximadamente o ciclo de Eddy (~1.000 anos) e de Suess/de Vries (~210 anos) sem afogar a figura. Quem refizer a análise com janelas diferentes verá figuras diferentes — sem que nenhuma delas seja "a verdadeira".
8.2 Comparar uma proxy local com um forçante global precisa de uma ponte teórica
Toda a discussão pressupõe que mudanças no forçante solar global se manifestam na temperatura groenlandesa. Existe literatura defendendo amplificação ártica do sinal solar (via efeitos sobre o vórtice polar, corrente de jato, NAO), e existe literatura cética. Esta demonstração não escolhe entre essas leituras — apenas exibe as duas séries no mesmo eixo temporal.
8.3 O número de manchas solares antes de 1610 não é "observado"
É uma reconstrução baseada em 14C cosmogênico, com pressupostos sobre a modulação do raio cósmico galáctico pelo campo magnético solar e sobre o transporte de carbono entre reservatórios atmosférico e oceânico. A linha "número de manchas solares" no gráfico, antes do telescópio, é portanto uma tradução de outro proxy. Plausível, peer-reviewed, mas não é o mesmo tipo de objeto que a contagem de Galileu em diante.