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:
GraphSpace preparado para o
cursoOs 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.
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)
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 = ", "))}
library("RGraphSpace")
library("Seurat")
library("SeuratObject")
library("sf")
library("ggplot2")
library("patchwork")
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
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()
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])
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]))
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))
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
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
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")
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.