--- a +++ b/docs/conversion.html @@ -0,0 +1,812 @@ +<!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>