1 Visão geral

Nesta vinheta, exploraremos limites celulares de um conjunto Xenium por meio da integração entre RGraphSpace, sf e ggplot2 (Sysbiolab Team 2026). Cada célula será representada de duas formas complementares: como um vértice localizado no centro da célula e como o polígono correspondente à sua segmentação. A expressão de Slc17a7 será projetada nas duas representações como exemplo de uso.

O roteiro foi adaptado da vinheta do Sysbiolab Team, Spatial segmentation with RGraphSpace.

Importante: esta análise não executa um novo algoritmo de segmentação sobre a imagem. Os limites celulares já foram estimados pelo processamento do Xenium; aqui, eles são carregados, inspecionados e utilizados como geometrias espaciais no GraphSpace.

Ao final, você será capaz de:

  1. baixar e carregar o objeto GraphSpace preparado para o curso
  2. acessar as geometrias celulares armazenadas no objeto
  3. inspecionar células individuais e um conjunto de células
  4. comparar a expressão representada nos centros e nos polígonos celulares

2 Origem e preparação dos dados

Os dados brutos do Xenium não serão baixados diretamente nesta atividade porque o arquivo compactado possui mais de 3 GB e a importação completa exige tempo, memória e processamento consideráveis. Para tornar a atividade rápida e reproduzível, usaremos apenas a região previamente recortada e salva como um objeto leve.

A preparação completa está documentada na vinheta avançada Instalação e preparação dos dados Xenium com RGraphSpace, disponível no repositório do curso. Nela, os dados brutos são baixados, carregados pelo Seurat, convertidos para GraphSpace, associados aos polígonos celulares, orientados e recortados.

O objeto resultante está versionado no repositório do curso: fonte de Xenium_GS_Crop.RDS no GitHub. O bloco de download desta vinheta utiliza o endereço direto desse arquivo.

3 Preparar o ambiente

3.1 Definir as pastas

Antes de executar o código, defina o diretório de trabalho como a pasta vinhetas/. No RStudio, use Session > Set Working Directory > To Source File Location. O objeto baixado será mantido em data/.

Curso_ST/
|-- imagens/
`-- data/
     `-- Xenium_GS_Crop.RDS
diretorio_vinhetas <- getwd()
diretorio_curso <- dirname(diretorio_vinhetas)
diretorio_imagens <- file.path(diretorio_curso, "imagens")
diretorio_dados <- file.path(diretorio_curso, "data")

dir.create(diretorio_dados, showWarnings = FALSE, recursive = TRUE)

3.2 Conferir os pacotes necessários

A instalação dos pacotes do curso está centralizada em Configuracao_do_ambiente_RStudio.Rmd. Depois de executar a vinheta e reiniciar a sessão do R, use o bloco abaixo para confirmar que o ambiente está pronto.

pacotes_segmentacao <- c(
  "RGraphSpace", "Seurat", "SeuratObject", "sf", "ggplot2", "patchwork")

pacotes_ausentes <- pacotes_segmentacao[
  !vapply(pacotes_segmentacao, requireNamespace, logical(1), quietly = TRUE)]

if (length(pacotes_ausentes) > 0) {
  stop("Execute primeiro Configuracao_do_ambiente_RStudio.Rmd. ",
    "Pacotes ausentes: ",paste(pacotes_ausentes, collapse = ", "))}

3.3 Carregar os pacotes

library("RGraphSpace")
library("Seurat")
library("SeuratObject")
library("sf")
library("ggplot2")
library("patchwork")

4 Baixar e carregar o objeto preparado

O download é realizado somente quando o arquivo ainda não existe em data/.

url_dados <- paste0(
  "https://raw.githubusercontent.com/flaviogckessler/Curso_ST/",
  "main/data/Xenium_GS_Crop.RDS")

arquivo_dados <- file.path(diretorio_dados, "Xenium_GS_Crop.RDS")

if (!file.exists(arquivo_dados)) {
  utils::download.file(url_dados,arquivo_dados,mode = "wb")}

gs_crop <- readRDS(arquivo_dados)

if (!inherits(gs_crop, "GraphSpace")) {
  stop("O arquivo baixado não contém um objeto da classe GraphSpace.")}

gs_crop

5 Inspecionar as geometrias celulares

Os polígonos estão armazenados como uma coleção de geometrias simples do pacote sf. Cada posição da coleção corresponde a uma célula e está alinhada ao respectivo vértice do GraphSpace.

gs_crop@nodes$geometry

geometrias_celulares <- gs_crop@nodes$geometry

length(geometrias_celulares)
sf::st_geometry_type(geometrias_celulares) |> table()

5.1 Visualizar células individuais

Para exemplificar, as três primeiras geometrias são mostradas separadamente. O contorno preserva a forma e a área estimadas para cada célula, enquanto sua posição permanece no sistema de coordenadas normalizado durante a preparação dos dados.

plot(gs_crop@nodes$geometry[1])
plot(gs_crop@nodes$geometry[2])
plot(gs_crop@nodes$geometry[3])

5.2 Combinar as primeiras vinte geometrias

st_combine() reúne as geometrias em uma única coleção sem dissolver os limites entre células. Assim, os vinte contornos continuam reconhecíveis no mesmo painel.

plot(st_combine(gs_crop@nodes$geometry[1:20]))

6 Comparar centros e polígonos celulares

Para que os dois painéis sejam comparáveis, ambos utilizam a transformação log2(x + 1), a mesma paleta e os mesmos limites de escala para a expressão de Slc17a7.

cpal <- hcl.colors(100, palette = "Geyser", rev = FALSE)
data_range <- range(log2(gs_crop[["fdata"]] + 1))

6.1 Representar as células como vértices

No primeiro painel, cada célula é representada por um ponto localizado em seu centro. Essa forma compacta facilita a inspeção da distribuição espacial geral, mas não mostra o contorno celular.

p1 <- ggplot(gs_crop) +
  geom_nodespace(
    mapping = aes(colour = log2(Slc17a7 + 1)),
    size = 1.5,pch = 19) +
  scale_colour_continuous(palette = cpal, limits = data_range) +
  theme_gspace_coords(
    theme = "th3",is_norm = TRUE,
    xlab = "Coordenada do tecido 1",
    ylab = "Coordenada do tecido 2")

p1

6.2 Representar as células como polígonos

No segundo painel, a expressão preenche o polígono de cada célula. Os centros são sobrepostos como pequenos pontos pretos para evidenciar a correspondência entre as duas representações.

p2 <- ggplot(gs_crop) +
  geom_sf(
    mapping = aes(
      geometry = geometry,
      fill = log2(Slc17a7 + 1))) +
  scale_fill_continuous(palette = cpal, limits = data_range) +
  geom_nodespace(colour = "black", size = 0.2, pch = 19) +
  theme_gspace_coords(
    theme = "th3",is_norm = TRUE,
    xlab = "Coordenada do tecido 1",
    ylab = "Coordenada do tecido 2")

p2

6.3 Colocar as representações lado a lado

O painel final resume a integração do RGraphSpace com as geometrias sf. A posição e a expressão são as mesmas nos dois lados; muda apenas a representação espacial de cada célula.

p <- p1 + p2 + 
  patchwork::plot_annotation(
    title = "Integração do RGraphSpace com geometrias sf",
    theme = theme(plot.title = element_text(hjust = 0.5)))
p

ggsave(filename = file.path(diretorio_imagens, "SegCelular_GS_Slc17a7.png"),
    plot = p,width = 9,height = 6,units = "in",dpi = 120,bg = "white")

7 Conclusão

A representação por vértices resume cada célula em uma posição, enquanto a representação por polígonos incorpora seus limites espaciais. Como o GraphSpace mantém expressão, posições e geometrias alinhadas, os mesmos atributos podem ser mapeados diretamente com a gramática do ggplot2 (Sysbiolab Team 2026).

O objeto data/Xenium_GS_Crop.RDS permanece disponível para novas explorações sem a necessidade de baixar e processar novamente os dados brutos do Xenium.

8 Informações da sessão

Referências

Sysbiolab Team. 2026. RGraphSpace: A Lightweight Interface Between ’Igraph’ and ’Ggplot2’ Graphics. https://sysbiolab.github.io/RGraphSpace/.