Azimlib0.3.0 · documentation

Dimensões, títulos e integração de composição

Outputs under gallery/ are local generated previews, not distributed assets. For versioned current images, see the 0.3 gallery.

import azimlib as azl

fig, ax = azl.subplots(figsize=(6.4, 4.8), layout='constrained')
ax.map('brazil')
ax.set_title('Brasil', loc='left', pad=8)
ax.set_title('Mapa político', loc='center')
right = ax.set_title('2026', loc='right')
right.set_visible(False)
fig.set_size_inches(8, 6)
fig.set_dpi(150)
fig.savefig('brasil.png', dpi=200)  # Não muda o DPI da Figure/viewer.
azl.show()

Contratos públicos

get_size_inches() devolve uma tupla independente. get_figwidth(), get_figheight() e get_dpi() consultam o estado. set_size_inches(w, h) ou set_size_inches((w, h)), set_figwidth(), set_figheight() e set_dpi() retornam None, validam números finitos positivos antes de alterar o estado e participam de stale/callbacks/setp. Mudar DPI preserva as dimensões em polegadas. Fontes, linhas e padding continuam expressos em pontos físicos.

Com viewer Tk aberto, forward=True ajusta o canvas e agenda redraw mesmo em modo não interativo. forward=False mantém a solicitação de tamanho da janela; fig.canvas.draw() renderiza explicitamente as novas dimensões. Um viewer fechado não recebe resize. Atributos diretos antigos continuam disponíveis; use os setters para notificação. O DPI de exportação PNG é temporário; o SVG mantém o contrato atual de Scene/viewBox, sem prometer todas as regras de unidades físicas do Matplotlib.

Há três títulos independentes, loc='left', 'center' e 'right'. get_title(loc) consulta cada slot. Repetir set_title() no mesmo slot preserva seu handle; visibilidade, remoção e clear() são funcionais. pad usa pontos e admite valores negativos finitos. fontdict é aceito, com kwargs tendo precedência. rcParams['axes.titlelocation'] e rcParams['axes.titlepad'] definem os padrões. O anchor acompanha loc; ha modifica o alinhamento do texto naquele anchor. O padrão vertical é baseline. Não existe redução automática de fonte para encaixar três títulos: o exemplo aninhado usa fonte explicitamente menor nos mapas pequenos.

A referência registrada compara seis operações de dimensões e os três títulos com Matplotlib 3.11.2/Agg. Os estados suportados coincidem. Diferenças: tupla em vez de ndarray, dimensões zero rejeitadas, e y/transforms de título fora deste contrato. Não há equivalência completa com o sistema de transforms ou SubFigure da referência.

Composição e exemplos

A matriz registrada contém 54 configurações: mapa único, atlas e GridSpecs aninhados × tight/constrained × três tamanhos por tipo × 100/150/200 DPI. Os 54 casos Azimlib completaram sem warnings ou primitivas medidas fora da Figure. As dimensões lógicas são estáveis entre DPIs. Também há regressões de recuperação após layout pequeno inviável, componentes vizinhos e preservação de Axes/cax posicionados manualmente.

Na referência, 45 casos completaram: 18 emitiram warning de incompatibilidade com tight layout, e nove casos aninhados/constrained com colorbar compartilhada entre GridSpecs distintos falharam com IndexError. São resultados deste roteiro e desta versão, não uma conclusão geral sobre Matplotlib. Os bounds são medidos por primitivas próprias e tight bboxes nativos, respectivamente; solvers e ornamentos diferem. A Azimlib adiciona escala/norte explicitamente; o núcleo Matplotlib não fornece equivalentes diretos. Não se declara igualdade de pixels.

O teste usa polígonos e valores sintéticos. A galeria usa divisões reais Natural Earth embarcadas, com valores de estações sintéticos: mapa (gallery/composition-single.png, generated locally), atlas (gallery/composition-atlas.png, generated locally) e aninhado (gallery/composition-nested.png, generated locally). PNG/SVG são estáticos; HTML é separado. Compare mapa (gallery/composition-single-comparison.png, generated locally) e atlas (gallery/composition-atlas-comparison.png, generated locally) lado a lado com Agg. Os layouts permanecem diferentes; textos livres e obstáculos posicionados explicitamente não ganham uma garantia universal de ausência de colisão.

Primeiro desenho e Tk

show() transfere callbacks e registra canvas/viewer antes do primeiro draw. Um callback de draw_event já observa o estado pronto. Falha nesse callback fecha/libera a janela, restaura o canvas/registro anteriores e permite nova tentativa; o callback também pode fechar sua janela sem acesso posterior a widgets destruídos. São regras da implementação própria.

O smoke cobre 14 cenários em Tk real oculto: primeiro draw, edições agrupadas, resize, DPI, exportação temporária, forward=False, recuperação de erro e fechamento em callback. Relatórios: source e wheel instalado. São eventos/edições programáticos; não medem aparência, input físico ou latência. Os 17 testes novos somam 101 subtests. CI remota, conferência de janela nativa e composição com bases densas continuam pendentes para a 0.2.0.

python examples/composition_matrix.py
python tools/smoke_composition_tk.py
# Somente desenvolvimento, com Matplotlib instalado:
python tools/inspect_sizing_titles.py
python tools/compare_composition_matrix.py
python tools/render_composition_comparisons.py