Azimlib0.3.0 · documentation

Edição de textos do mapa e annotations

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

ax.text() devolve um MapText e ax.annotate() devolve uma Annotation própria. Ambos continuam subclasses de Layer/Artist, com visibilidade, remoção, callbacks, invalidação e estilo usados pela mesma composição.

import azimlib as azl

fig, ax = azl.subplots()
ax.set_extent((-54, -42, -28, -16))
text = ax.text(-48, -22, "Local inicial")
text.set(position=(-46, -20), text="Local editado", color="red", ha="center")
text.set_x(-45)
text.set_y(-19)
print(text.get_position())

Posição significa longitude/latitude em graus com transform="data", ou frações do Axes com transform="axes". set_position, set_x/set_y e os respectivos getters respeitam esse sistema; não deslocam limites nem disparam autoescala. setp/getp também aceitam essas propriedades. Latitude geográfica é validada em [-90,90]; longitude segue o núcleo existente, inclusive valores desenrolados. Posições fora do Axes podem ser cortadas pelo viewport.

Os handles oferecem set/get_horizontalalignment, set/get_verticalalignment e aliases ha/va, fontfamily/fontstyle, size/weight. Texto de título, rótulo, legenda e colorbar também recebe esses setters de estilo. A família suportada é uma string; isso não reproduz FontProperties e sua lista de fallback. Fonte em tamanho numérico e os limites de shaping existentes continuam válidos. Rotação consultada é normalizada em [0,360), como na referência.

Posição do texto e destino da annotation

note = ax.annotate(
    "Destino", xy=(-48, -22), xytext=(18, 20),
    textcoords="offset points", color="#553377"
)
note.xy = (-44, -20)       # destino geográfico da seta
note.xyann = (-100, -26)  # posição do texto no sistema textcoords
note.set_position((-80, 12))
note.set_anncoords("offset points")

get_position()/set_position() editam o texto, preservando xy. xy é sempre o destino lon/lat; xyann acompanha a posição do texto. get_anncoords() e set_anncoords() consultam/trocam o sistema, sem converter numericamente os valores existentes, como na referência.

textcoords/anncoords Unidades Y positivo
"data" graus lon/lat norte
"axes fraction" ou alias anterior "axes" frações do mapa para cima
"offset points" pontos físicos a partir de xy para cima
"offset pixels" anterior pixels lógicos a 100 DPI a partir de xy para baixo

offset points preserva a distância física ao variar DPI/projeção. O caminho anterior offset pixels e seu default de (20,-20) foram mantidos para não alterar exemplos existentes; não são a semântica de offset pixels do Matplotlib. Use offset points para a convenção familiar de anotação.

O lote abaixo é uma conveniência adicional própria: xy, posição, sistema e estilo são validados juntos antes de alterar o mesmo handle.

note.set(
    xy=(-44, -20), position=(0.6, 0.8), anncoords="axes fraction",
    text="Novo destino", color="blue", fontsize=12
)

Recomposição de seta, texto, clipping e obstáculos de labels utiliza as coordenadas editadas. set_visible(False) e remove() continuam funcionando; editar um handle removido não invalida sua Figure antiga. Não cria um sistema geral de Transforms, xycoords customizados, picking ou edição por arrastar. Arrowprops/FancyArrowPatch ainda não estão implementados. O estilo de seta próprio e seus limites continuam os anteriores. Camadas de texto agora oferecem rotation_mode, compartilhado com os demais textos.

Títulos e rótulos de componentes

legend = ax.legend(title="Pesquisa")
legend.set_title("Pesquisa atualizada", fontsize=11, color="black")
bar.set_label("Indicador atualizado", labelpad=6, loc="center", fontsize=11)

Estilo/alinhamento inválido não deixa o texto parcialmente modificado. Colorbar.set_label() valida também labelpad/loc antes de gravar; o título da legenda e seu dicionário, ou o rótulo da barra e sua posição, chegam coerentes aos callbacks. Um lote válido notifica uma vez por handle editado; a contagem exata de callbacks do Matplotlib não é reproduzida. Exceções em callbacks ocorrem após o commit e não desfazem a edição, como no protocolo Artist existente.

Exemplos e validação

O exemplo exporta antes (gallery/component-text-edits-before.png, generated locally) e depois (gallery/component-text-edits-after.png, generated locally), incluindo mapa, texto, annotation, legenda, escala e colorbar horizontal, sem Matplotlib. Os comparativos antes (gallery/text-edits-before-comparison.png, generated locally) e depois (gallery/text-edits-after-comparison.png, generated locally) usam Axes/layout independentes no Matplotlib instalado e as mesmas coordenadas/estilos. Fontes, clipping de texto, composição e setas apresentam diferenças; não há igualdade de pixels ou implementação completa do sistema Text/Annotation.

19 estados foram registrados diretamente de Matplotlib 3.11.2/Agg e verificados em testes sem importar a referência. As regressões também verificam edição atômica, callbacks finais, ownership, projeções/DPI, offsets, obstáculos e exportação própria. tools/inspect_text_edits.py recria contratos/comparativos em desenvolvimento. Nenhum renderizador ou classe do Matplotlib é usado no runtime.