<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta http-equiv="X-UA-Compatible" content="IE=EDGE" />
<title>Conversion</title>
<script src="site_libs/header-attrs-2.29/header-attrs.js"></script>
<script src="site_libs/jquery-3.6.0/jquery-3.6.0.min.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="site_libs/bootstrap-3.3.5/css/flatly.min.css" rel="stylesheet" />
<script src="site_libs/bootstrap-3.3.5/js/bootstrap.min.js"></script>
<script src="site_libs/bootstrap-3.3.5/shim/html5shiv.min.js"></script>
<script src="site_libs/bootstrap-3.3.5/shim/respond.min.js"></script>
<style>h1 {font-size: 34px;}
h1.title {font-size: 38px;}
h2 {font-size: 30px;}
h3 {font-size: 24px;}
h4 {font-size: 18px;}
h5 {font-size: 16px;}
h6 {font-size: 12px;}
code {color: inherit; background-color: rgba(0, 0, 0, 0.04);}
pre:not([class]) { background-color: white }</style>
<script src="site_libs/jqueryui-1.13.2/jquery-ui.min.js"></script>
<link href="site_libs/tocify-1.9.1/jquery.tocify.css" rel="stylesheet" />
<script src="site_libs/tocify-1.9.1/jquery.tocify.js"></script>
<script src="site_libs/navigation-1.1/tabsets.js"></script>
<link href="site_libs/highlightjs-9.12.0/textmate.css" rel="stylesheet" />
<script src="site_libs/highlightjs-9.12.0/highlight.js"></script>
<link href="site_libs/font-awesome-6.5.2/css/all.min.css" rel="stylesheet" />
<link href="site_libs/font-awesome-6.5.2/css/v4-shims.min.css" rel="stylesheet" />
<style type="text/css">
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
</style>
<style type="text/css">code{white-space: pre;}</style>
<script type="text/javascript">
if (window.hljs) {
hljs.configure({languages: []});
hljs.initHighlightingOnLoad();
if (document.readyState && document.readyState === "complete") {
window.setTimeout(function() { hljs.initHighlighting(); }, 0);
}
}
</script>
<style type = "text/css">
.main-container {
max-width: 940px;
margin-left: auto;
margin-right: auto;
}
img {
max-width:100%;
}
.tabbed-pane {
padding-top: 12px;
}
.html-widget {
margin-bottom: 20px;
}
button.code-folding-btn:focus {
outline: none;
}
summary {
display: list-item;
}
details > summary > p:only-child {
display: inline;
}
pre code {
padding: 0;
}
</style>
<style type="text/css">
.dropdown-submenu {
position: relative;
}
.dropdown-submenu>.dropdown-menu {
top: 0;
left: 100%;
margin-top: -6px;
margin-left: -1px;
border-radius: 0 6px 6px 6px;
}
.dropdown-submenu:hover>.dropdown-menu {
display: block;
}
.dropdown-submenu>a:after {
display: block;
content: " ";
float: right;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 5px 0 5px 5px;
border-left-color: #cccccc;
margin-top: 5px;
margin-right: -10px;
}
.dropdown-submenu:hover>a:after {
border-left-color: #adb5bd;
}
.dropdown-submenu.pull-left {
float: none;
}
.dropdown-submenu.pull-left>.dropdown-menu {
left: -100%;
margin-left: 10px;
border-radius: 6px 0 6px 6px;
}
</style>
<script type="text/javascript">
// manage active state of menu based on current page
$(document).ready(function () {
// active menu anchor
href = window.location.pathname
href = href.substr(href.lastIndexOf('/') + 1)
if (href === "")
href = "index.html";
var menuAnchor = $('a[href="' + href + '"]');
// mark the anchor link active (and if it's in a dropdown, also mark that active)
var dropdown = menuAnchor.closest('li.dropdown');
if (window.bootstrap) { // Bootstrap 4+
menuAnchor.addClass('active');
dropdown.find('> .dropdown-toggle').addClass('active');
} else { // Bootstrap 3
menuAnchor.parent().addClass('active');
dropdown.addClass('active');
}
// Navbar adjustments
var navHeight = $(".navbar").first().height() + 15;
var style = document.createElement('style');
var pt = "padding-top: " + navHeight + "px; ";
var mt = "margin-top: -" + navHeight + "px; ";
var css = "";
// offset scroll position for anchor links (for fixed navbar)
for (var i = 1; i <= 6; i++) {
css += ".section h" + i + "{ " + pt + mt + "}\n";
}
style.innerHTML = "body {" + pt + "padding-bottom: 40px; }\n" + css;
document.head.appendChild(style);
});
</script>
<!-- tabsets -->
<style type="text/css">
.tabset-dropdown > .nav-tabs {
display: inline-table;
max-height: 500px;
min-height: 44px;
overflow-y: auto;
border: 1px solid #ddd;
border-radius: 4px;
}
.tabset-dropdown > .nav-tabs > li.active:before, .tabset-dropdown > .nav-tabs.nav-tabs-open:before {
content: "\e259";
font-family: 'Glyphicons Halflings';
display: inline-block;
padding: 10px;
border-right: 1px solid #ddd;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open > li.active:before {
content: "\e258";
font-family: 'Glyphicons Halflings';
border: none;
}
.tabset-dropdown > .nav-tabs > li.active {
display: block;
}
.tabset-dropdown > .nav-tabs > li > a,
.tabset-dropdown > .nav-tabs > li > a:focus,
.tabset-dropdown > .nav-tabs > li > a:hover {
border: none;
display: inline-block;
border-radius: 4px;
background-color: transparent;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open > li {
display: block;
float: none;
}
.tabset-dropdown > .nav-tabs > li {
display: none;
}
</style>
<!-- code folding -->
<style type="text/css">
#TOC {
margin: 25px 0px 20px 0px;
}
@media (max-width: 768px) {
#TOC {
position: relative;
width: 100%;
}
}
@media print {
.toc-content {
/* see https://github.com/w3c/csswg-drafts/issues/4434 */
float: right;
}
}
.toc-content {
padding-left: 30px;
padding-right: 40px;
}
div.main-container {
max-width: 1200px;
}
div.tocify {
width: 20%;
max-width: 260px;
max-height: 85%;
}
@media (min-width: 768px) and (max-width: 991px) {
div.tocify {
width: 25%;
}
}
@media (max-width: 767px) {
div.tocify {
width: 100%;
max-width: none;
}
}
.tocify ul, .tocify li {
line-height: 20px;
}
.tocify-subheader .tocify-item {
font-size: 0.90em;
}
.tocify .list-group-item {
border-radius: 0px;
}
.tocify-subheader {
display: inline;
}
.tocify-subheader .tocify-item {
font-size: 0.95em;
}
</style>
</head>
<body>
<div class="container-fluid main-container">
<!-- setup 3col/9col grid for toc_float and main content -->
<div class="row">
<div class="col-xs-12 col-sm-4 col-md-3">
<div id="TOC" class="tocify">
</div>
</div>
<div class="toc-content col-xs-12 col-sm-8 col-md-9">
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-bs-toggle="collapse" data-target="#navbar" data-bs-target="#navbar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.html">VoltRon</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>
<a href="tutorials.html">Explore</a>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Vignette
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li class="dropdown-submenu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">Spatial Data Integration</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="registration.html">Spatial Data Alignment</a>
</li>
<li>
<a href="multiomic.html">Multi-omic Integration</a>
</li>
<li>
<a href="nicheclustering.html">Niche Clustering</a>
</li>
</ul>
</li>
<li class="dropdown-submenu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">Downstream Analysis</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="roianalysis.html">ROI Analysis</a>
</li>
<li>
<a href="spotanalysis.html">Cell/Spot Analysis</a>
</li>
<li>
<a href="moleculeanalysis.html">Molecule Analysis</a>
</li>
<li>
<a href="pixelanalysis.html">Pixels (Image Only) Analysis</a>
</li>
</ul>
</li>
<li class="dropdown-submenu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">Utilities</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="interactive.html">Interactive Utilities</a>
</li>
<li>
<a href="importingdata.html">Importing Spatial Data</a>
</li>
<li>
<a href="voltronobjects.html">Working with VoltRon Objects</a>
</li>
<li>
<a href="conversion.html">Converting VoltRon Objects</a>
</li>
<li>
<a href="ondisk.html">OnDisk-based Analysis Utilities</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<span class="fa fa-envelope-o"></span>
Contact
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="https://bioinformatics.mdc-berlin.de">Altuna Lab/BIMSB Bioinfo</a>
</li>
<li>
<a href="https://www.mdc-berlin.de/landthaler">Landthaler Lab/BIMSB</a>
</li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<span class="fa fa-github"></span>
GitHub
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="https://github.com/BIMSBbioinfo/VoltRon">VoltRon</a>
</li>
<li>
<a href="https://github.com/BIMSBbioinfo">BIMSB Bioinfo</a>
</li>
</ul>
</li>
</ul>
</div><!--/.nav-collapse -->
</div><!--/.container -->
</div><!--/.navbar -->
<div id="header">
<h1 class="title toc-ignore">Conversion</h1>
</div>
<style>
.title{
display: none;
}
body {
text-align: justify
}
.center {
display: block;
margin-left: auto;
margin-right: auto;
}
</style>
<style type="text/css">
.watch-out {
color: black;
}
</style>
<p><br></p>
<div id="conversion-to-other-platforms" class="section level1">
<h1>Conversion to Other Platforms</h1>
<p>VoltRon is capable of end-to-end spatial data analysis for all levels
of spatial resolutions, including those of single cell resolution.
However, VoltRon provides a ecosystem friendly infrastructure where
VoltRon objects could be transformed into data structures used by
popular computational platforms such as <a
href="https://satijalab.org/seurat/">Seurat</a>, <a
href="https://squidpy.readthedocs.io/en/stable/">Squidpy</a> and even <a
href="http://vitessce.io/docs/data-file-types/#anndata-zarr">Zarr</a>
for interactive spatial data visualizatiob with <a
href="http://vitessce.io/">Vitessce</a>.</p>
<p>For both <strong>Seurat (R)</strong> and <strong>Squidpy
(Python)</strong>, we analyse readouts of the experiments conducted on
example tissue sections analysed by the <a
href="https://www.10xgenomics.com/platforms/xenium">Xenium In Situ</a>
platform. For more information on processing and analyzing Xenium
datasets, check the <a href="spotanalysis.html">Cell/Spot Analysis</a>
tutorial.</p>
<p><br></p>
<div id="seurat" class="section level2">
<h2>Seurat</h2>
<p>We will first see how we can transform VoltRon objects into Seurat
object and use built-in functions such as
<strong>FindAllMarkers</strong> to visualize marker genes of clusters
found by VoltRon. You can find the clustered Xenium data using VoltRon
<a
href="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Cellanalysis/Xenium/Xenium_data_clustered.rds">here</a>.</p>
<pre class="r watch-out"><code>Xen_data <- readRDS("Xenium_data_clustered.rds")
SampleMetadata(Xen_data)</code></pre>
<pre><code> Assay Layer Sample
Assay1 Xenium Section1 XeniumR1
Assay3 Xenium Section1 XeniumR2</code></pre>
<p><br></p>
<p>We use the <strong>as.Seurat</strong> function to convert spatial
assays of VoltRon into Seurat objects. Here, a Seurat object defines
spatial components of cellular and subcellular assays as
<strong>FOV</strong> objects, and we use the <strong>type =
“image”</strong> argument to convert spatial coordinates of cells and
molecules into individual FOV objects for each Xenium assay/layer in the
VoltRon object.</p>
<p>Please check the <a
href="https://satijalab.org/seurat/articles/seurat5_spatial_vignette_2">Analysis
of Image-based Spatial Data in Seurat</a> tutorial for more information
on analyzing FOV-based spatial data sets with Seurat.</p>
<p>note: Use VoltRon::as.Seurat to avoid conflict with Seurat package’s
as.Seurat function</p>
<pre class="r watch-out"><code>library(Seurat)
Xen_data_seu <- VoltRon::as.Seurat(Xen_data, cell.assay = "Xenium", type = "image")
Xen_data_seu <- NormalizeData(Xen_data_seu)
Xen_data_seu</code></pre>
<pre><code>An object of class Seurat
313 features across 283298 samples within 1 assay
Active assay: Xenium (313 features, 0 variable features)
1 layers present: counts
2 dimensional reductions calculated: pca, umap
2 spatial fields of view present: fov_Assay1 fov_Assay3</code></pre>
<p><br></p>
<div id="marker-analysis" class="section level3">
<h3>Marker Analysis</h3>
<p>Now that we converted VoltRon into a Seurat object, we can pick the
<strong>Clusters</strong> metadata column indicating the clustering of
cells and test for marker genes of each individual cluster.</p>
<pre class="r watch-out"><code>Idents(Xen_data_seu) <- "Clusters"
markers <- FindAllMarkers(Xen_data_seu)
head(markers[order(markers$avg_log2FC, decreasing = TRUE),])</code></pre>
<div>
<pre><code style="font-size: 13px;"> p_val avg_log2FC pct.1 pct.2 p_val_adj cluster gene
CPA3 0 7.343881 0.977 0.029 0 16 CPA3
CTSG 0 7.114698 0.878 0.011 0 16 CTSG
LILRA4.1 0 6.992717 0.939 0.015 0 19 LILRA4
ADIPOQ 0 6.860190 0.974 0.025 0 5 ADIPOQ
MS4A1 0 6.763083 0.919 0.027 0 17 MS4A1
BANK1 0 6.082192 0.889 0.037 0 17 BANK1</code></pre>
</div>
<p><br></p>
</div>
<div id="visualization" class="section level3">
<h3>Visualization</h3>
<p>We can now pick top positive markers from each of these clusters
prior to visualization.</p>
<pre class="r watch-out"><code>library(dplyr)
topmarkers <- markers %>%
group_by(cluster) %>%
top_n(n = 5, wt = avg_log2FC)</code></pre>
<p>Here, VoltRon incorporates the unique markers learned by the
<strong>FindAllMarkers</strong> function from Seurat and uses them to
visualize the expression of these markers on heatmaps, and now we can
also use these markers for annotating the clusters.</p>
<pre class="r watch-out"><code>library(ComplexHeatmap)
marker_features <- unique(topmarkers$gene)
vrHeatmapPlot(Xen_data, features = marker_features, group.by = "Clusters",
show_row_names = TRUE, font.size = 10)</code></pre>
<p><img width="100%" height="100%" src="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Package/images/conversions_seurat_heatmap.png" class="center"></p>
<p><br></p>
</div>
<div id="convert-with-molecule-data" class="section level3">
<h3>Convert with Molecule Data</h3>
<p>If defined, the <strong>as.Seurat</strong> function may also convert
the molecule assay of the VoltRon object into a Seurat FOV object and
allow visualizing molecules. You can find the Xenium VoltRon object with
the molecule assay <a
href="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Cellanalysis/Xenium/Xen_R1.rds">here</a>.</p>
<pre class="r watch-out"><code>Xen_R1 <- readRDS("Xen_R1.rds")
SampleMetadata(Xen_R1)</code></pre>
<pre><code> Assay Layer Sample
Assay1 Xenium Section1 XeniumR1
Assay2 Xenium_mol Section1 XeniumR1</code></pre>
<p><br></p>
<p>We define both the cell level assay and the molecule level assay.</p>
<pre class="r watch-out"><code>Xen_R1_seu <- as.Seurat(Xen_R1, cell.assay = "Xenium", molecule.assay = "Xenium_mol", type = "image")</code></pre>
<p><br></p>
<p>Now we can visualize molecules alongside with cells.</p>
<pre class="r watch-out"><code>ImageDimPlot(Xen_R1_seu, fov = "fovAssay1", molecules = "PGR", group.by = "orig.ident", cols = "lightgrey", mols.size = 1)</code></pre>
<p><img width="60%" height="60%" src="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Package/images/conversions_seurat_imagedimplot.png" class="center"></p>
<p><br></p>
</div>
</div>
<div id="spatialexperiment" class="section level2">
<h2>SpatialExperiment</h2>
<p>VoltRon can also convert objects in <a
href="https://www.bioconductor.org/packages/release/bioc/html/SpatialExperiment.html">SpatialExperiment</a>
objects. We are going to use the Xenium data clustered using VoltRon <a
href="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Cellanalysis/Xenium/Xenium_data_clustered.rds">here</a>.</p>
<pre class="r watch-out"><code>Xen_data <- readRDS("Xenium_data_clustered.rds")
SampleMetadata(Xen_data)</code></pre>
<p>We use the <strong>as.SpatialExperiment</strong> function to convert
spatial assays of VoltRon into SpatialExperiment objects. Please check
the <a
href="https://www.bioconductor.org/packages/release/bioc/vignettes/SpatialExperiment/inst/doc/SpatialExperiment.html">Introduction
to the SpatialExperiment class</a> tutorial for more information.</p>
<pre class="r watch-out"><code>library(SpatialExperiment)
spe <- as.SpatialExperiment(Xen_data, assay = "Xenium")</code></pre>
<p>Here we can parse the image and visualize.</p>
<pre class="r watch-out"><code>img <- imgRaster(spe,
sample_id = "Assay1",
image_id = "main")
plot(img)</code></pre>
<p><br></p>
</div>
<div id="squidpy-anndata-h5ad" class="section level2">
<h2>Squidpy (Anndata, h5ad)</h2>
<p>A true ecosystem friendly computational platform should support data
types across multiple computing environments. By allowing users to
convert VoltRon objects into annotated data matrix formats such as <a
href="https://github.com/scverse/anndata">anndata</a>, we can use
built-in spatial data analysis methods available on <a
href="https://squidpy.readthedocs.io/en/stable/">squidpy</a>.</p>
<p>You can find the clustered and the annotated Xenium data using
VoltRon <a
href="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Cellanalysis/Xenium/Xenium_data_clustered_annotated.rds">here</a>.</p>
<p>Anndata objects wrapped on h5ad files are commonly used by the <a
href="https://www.nature.com/articles/s41587-023-01733-8">scverse</a>
ecosystem for single cell analysis which bring together numeruous tools
maintained and distributed by a large community effort. Both squidpy and
<a href="https://scanpy.readthedocs.io/en/stable/">scanpy</a> are
currently available on scverse.</p>
<pre class="r watch-out"><code>Xen_data <- readRDS("Xenium_data_clustered_annotated.rds")
as.AnnData(Xen_data, assay = "Xenium", file = "Xen_adata_annotated.h5ad")</code></pre>
<p><br></p>
<div id="configure-squidpy-scverse" class="section level3">
<h3>Configure Squidpy (scverse)</h3>
<p>Here, we use the <a
href="https://rstudio.github.io/reticulate/">reticulate</a> package to
call <strong>scverse</strong> module in Python through a prebuilt
anaconda environment. However, any python installation with the scverse
module can be incorporated by reticulate.</p>
<pre class="r watch-out"><code>library(reticulate)
use_condaenv("scverse", required = T)</code></pre>
<p>We import some other necessary modules such as pandas, scanpy and
squidpy.</p>
<pre class="python watch-out"><code>from pathlib import Path
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import scanpy as sc
import squidpy as sq
sc.logging.print_header()</code></pre>
<p><br></p>
</div>
<div id="filter-and-normalize" class="section level3">
<h3>Filter and Normalize</h3>
<p>We read the annotated Xenium object that was saved as an h5ad file
using the <strong>as.Anndata</strong> function in VoltRon, and process
before analysis. For more information using scanpy and squidpy on Xenium
datasets, check the <a
href="https://squidpy.readthedocs.io/en/stable/notebooks/tutorials/tutorial_xenium.html">Analyzing
Xenium data</a> tutorial at squidpy webpage.</p>
<pre class="python watch-out"><code>adata = sc.read_h5ad("Xen_adata_annotated.h5ad")
adata.layers["counts"] = adata.X.copy()
sc.pp.normalize_total(adata, inplace=True)
sc.pp.log1p(adata)</code></pre>
<p><br></p>
</div>
<div id="visualize" class="section level3">
<h3>Visualize</h3>
<p>We use the <strong>squidpy.pl.spatial_scatter</strong> functions
available in squidpy to visualize the spatial localization of cell types
of both Xenium replicates.</p>
<pre class="python watch-out"><code>fig, ax = plt.subplots(1, 2, figsize=(10, 7))
sq.pl.spatial_scatter(adata, library_key = "library_id", library_id = "Assay1",
color=["CellType"], shape=None, size=1, img = False, ax=ax[0])
sq.pl.spatial_scatter(adata, library_key = "library_id", library_id = "Assay3",
color=["CellType"], shape=None, size=1, img = False, ax=ax[1])
plt.show(ax)</code></pre>
<p><img width="100%" height="100%" src="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Package/images/conversions_anndata_spatial_scatter.png" class="center"></p>
<p><br></p>
</div>
<div id="neighborhood-enrichment" class="section level3">
<h3>Neighborhood Enrichment</h3>
<p>We can now use high level spatially-aware functions available in
squidpy. We first establish spatial neighbors using the delaunay graphs.
The spatial graph and distances will be stored under
<strong>.obsp</strong> attribute/matrix.</p>
<pre class="python watch-out"><code>sq.gr.spatial_neighbors(adata, coord_type="generic", delaunay=True)
adata</code></pre>
<pre><code>AnnData object with n_obs × n_vars = 283298 × 313
obs: 'Count', 'Assay', 'Layer', 'Sample', 'Clusters', 'CellType', 'library_id'
uns: 'log1p', 'spatial_neighbors'
obsm: 'spatial'
layers: 'counts'
obsp: 'spatial_connectivities', 'spatial_distances'</code></pre>
<p>We can now conduct the permutation test for neighborhood enrichment
across cell type pairs.</p>
<pre class="python watch-out"><code>sq.gr.nhood_enrichment(adata, cluster_key="CellType")</code></pre>
<pre class="python watch-out"><code>fig, ax = plt.subplots(1, 2, figsize=(13, 7))
sq.pl.nhood_enrichment(adata, cluster_key="CellType", figsize=(8, 8),
title="Neighborhood enrichment adata", ax=ax[0])
sq.pl.spatial_scatter(adata, color="CellType", library_key = "library_id",
library_id = "Assay1", shape=None, size=2, ax=ax[1])
plt.show(ax)</code></pre>
<p><img width="100%" height="100%" src="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Package/images/conversions_anndata_neighborhood.png" class="center"></p>
<p><br></p>
</div>
</div>
<div id="vitessce-anndata-zarr" class="section level2">
<h2>Vitessce (Anndata, zarr)</h2>
<p>In this section, we will transform VoltRon objects of Xenium data
into zarr arrays, and use them for interactive visualization in <a
href="http://vitessce.io/">Vitessce</a>. We should first download the
vitessceR package which incorporates wrapper function to visualize zarr
arrays interactively in R.</p>
<pre class="r watch-out"><code>install.packages("devtools")
devtools::install_github("vitessce/vitessceR")</code></pre>
<p><br></p>
<p>You can find the clustered and annotated Xenium data using VoltRon <a
href="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Cellanalysis/Xenium/Xenium_data_clustered_annotated.rds">here</a>.</p>
<pre class="r watch-out"><code>Xen_data <- readRDS("Xenium_data_clustered_annotated.rds")
SampleMetadata(Xen_data)</code></pre>
<pre><code> Assay Layer Sample
Assay1 Xenium Section1 XeniumR1
Assay2 Xenium Section1 XeniumR2</code></pre>
<p><br></p>
<div id="interactive-visualization" class="section level3">
<h3>Interactive Visualization</h3>
<p>Now we can convert the VoltRon object into a zarr array using the
<strong>as.Zarr</strong> function which will create the array in a
specified location.</p>
<pre class="r watch-out"><code>as.AnnData(Xen_data, assays = "Assay1",
file = "xendata_clustered_annotated.zarr", flip_coordinates = TRUE)</code></pre>
<p>We can use the zarr file directly in the
<strong>vrSpatialPlot</strong> function to visualize the zarr array
interactively in Rstudio viewer. The <strong>reduction</strong>
arguement allows the umap of the Xenium data to be visualized alongside
with the spatial coordinates of the Xenium cells.</p>
<pre class="r watch-out"><code>vrSpatialPlot("xendata_clustered_annotated.zarr", group.by = "CellType", reduction = "umap")</code></pre>
<p><img width="100%" height="100%" src="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Package/images/conversions_interactive.png" class="center">
<br>
<img width="100%" height="100%" src="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Package/images/conversions_interactive_zoom.png" class="center"></p>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
// add bootstrap table styles to pandoc tables
function bootstrapStylePandocTables() {
$('tr.odd').parent('tbody').parent('table').addClass('table table-condensed');
}
$(document).ready(function () {
bootstrapStylePandocTables();
});
</script>
<!-- tabsets -->
<script>
$(document).ready(function () {
window.buildTabsets("TOC");
});
$(document).ready(function () {
$('.tabset-dropdown > .nav-tabs > li').click(function () {
$(this).parent().toggleClass('nav-tabs-open');
});
});
</script>
<!-- code folding -->
<script>
$(document).ready(function () {
// temporarily add toc-ignore selector to headers for the consistency with Pandoc
$('.unlisted.unnumbered').addClass('toc-ignore')
// move toc-ignore selectors from section div to header
$('div.section.toc-ignore')
.removeClass('toc-ignore')
.children('h1,h2,h3,h4,h5').addClass('toc-ignore');
// establish options
var options = {
selectors: "h1,h2,h3",
theme: "bootstrap3",
context: '.toc-content',
hashGenerator: function (text) {
return text.replace(/[.\\/?&!#<>]/g, '').replace(/\s/g, '_');
},
ignoreSelector: ".toc-ignore",
scrollTo: 0
};
options.showAndHide = false;
options.smoothScroll = false;
// tocify
var toc = $("#TOC").tocify(options).data("toc-tocify");
});
</script>
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
(function () {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
document.getElementsByTagName("head")[0].appendChild(script);
})();
</script>
</body>
</html>