Last updated: 2020-06-05

Checks: 7 0

Knit directory: STUtility_web_site/

This reproducible R Markdown analysis was created with workflowr (version 1.6.2). The Checks tab describes the reproducibility checks that were applied when the results were created. The Past versions tab lists the development history.


Great! Since the R Markdown file has been committed to the Git repository, you know the exact version of the code that produced these results.

Great job! The global environment was empty. Objects defined in the global environment can affect the analysis in your R Markdown file in unknown ways. For reproduciblity it’s best to always run the code in an empty environment.

The command set.seed(20191031) was run prior to running the code in the R Markdown file. Setting a seed ensures that any results that rely on randomness, e.g. subsampling or permutations, are reproducible.

Great job! Recording the operating system, R version, and package versions is critical for reproducibility.

Nice! There were no cached chunks for this analysis, so you can be confident that you successfully produced the results during this run.

Great job! Using relative paths to the files within your workflowr project makes it easier to run your code on other machines.

Great! You are using Git for version control. Tracking code development and connecting the code version to the results is critical for reproducibility.

The results in this page were generated with repository version f3c5cb4. See the Past versions tab to see a history of the changes made to the R Markdown and HTML files.

Note that you need to be careful to ensure that all relevant files for the analysis have been committed to Git prior to generating the results (you can use wflow_publish or wflow_git_commit). workflowr only checks the R Markdown file, but you know if there are other scripts or data files that it depends on. Below is the status of the Git repository when the results were generated:


Ignored files:
    Ignored:    .DS_Store
    Ignored:    analysis/.DS_Store
    Ignored:    analysis/manual_annotation.png
    Ignored:    analysis/visualization_3D.Rmd
    Ignored:    pre_data/

Note that any generated files, e.g. HTML, png, CSS, etc., are not included in this status report because it is ok for generated content to have uncommitted changes.


These are the previous versions of the repository in which changes were made to the R Markdown (analysis/3D_visualization.Rmd) and HTML (docs/3D_visualization.html) files. If you’ve configured a remote Git repository (see ?wflow_git_remote), click on the hyperlinks in the table below to view the files as they were in that past version.

File Version Author Date Message
html f3c5cb4 Ludvig Larsson 2020-06-05 Build site.
html f89df7e Ludvig Larsson 2020-06-05 Build site.
Rmd 672b4e5 Ludvig Larsson 2020-06-05 downsampled points in 3D visualization
html 1e67a7c Ludvig Larsson 2020-06-04 Build site.
html f71b0c0 Ludvig Larsson 2020-06-04 Build site.
html 4c48cfa Ludvig Larsson 2020-06-04 Build site.
Rmd a0ea32a Ludvig Larsson 2020-06-04 update website
html 23df05c jbergenstrahle 2020-01-11 Build site.
Rmd efbbda3 jbergenstrahle 2020-01-01 update pek
Rmd 672191f Ludvig Larsson 2019-12-16 Added 3D plotting to vignette
html 672191f Ludvig Larsson 2019-12-16 Added 3D plotting to vignette


Creating 3D stack of points


STutility currently allows for visualization of features in 3D using a point cloud created from the nuclei detected in aligned HE images using the Create3DStack() function. The cell nuclei coordinates are extracted based on color intensity as nuclei are typically darker in color than the surrounding tissue. This is not an exact cell segmentation but it will typically capture the density of nuclei well enough to define various morphological structures.

Once the nuclei coordinates have been extracted from each aligned section, a z value will be assigned to each section to create a 3D stack. Feature values can be interpolated across the points in the stack and then visualized in 3D by mapping the values to a colorscale. Below are a couple of criteria that has to be fulfilled for the method to work:

  1. The sections have to come from the same tissue type with similar morphology for each section
  2. HE image has to be aligned, i.e. you have to run LoadImages(), MaskImages() and AlignImages() (or ManualAlignImages()) first
  3. The images have to be loaded in higher resolution than the default 400 pixels. The Create3DStack() will automatically reload the images in higher resolution if the image widths are lower than 400 pixels or you can run SwitchResolution() to reload the images in higher resolution before running Create3DStack()
  4. The cell segmentation is based on color intensity and might therefore fail if artifacts are present in the HE images. This could for example be classifications, hair, folds, bubbles or dust. Uneven section thickness and staining can also affect the segmentation performance.
  5. It is assumed that the tissue sections have been stained with Hematoxylin and Eosin

Once the stack has been created, a 2D grid will be created that covers the aligned tissue sections with its width determined by the nx parameter. This grid will later be used to interpolate feature values over, so that we can assign a value to each point in the point cloud.


se <- Create3DStack(se)


Point patterns


We can plot the stacked coordinates in 2D to see what the point patterns look like. From the plot below you can see that a higher density of points is picked up in areas width darker color, which is typically the case for the tissue edges.

stack_3d <- setNames(GetStaffli(se)@scatter.data, c("x", "y", "z", "grid.cell"))

ggplot(stack_3d, aes(x, 2e3 - y)) +
  geom_point(size = 0.1, color = "lightgray") +
  facet_wrap(~z, ncol = 1) +
  theme_void() +
  theme(plot.background = element_rect(fill = "black"), 
        plot.title = element_text(colour = "white"), 
        legend.text = element_text(colour = "white"))

Version Author Date
4c48cfa Ludvig Larsson 2020-06-04
23df05c jbergenstrahle 2020-01-11
672191f Ludvig Larsson 2019-12-16


Data interpolation


The next step to visualize features is to interpolate values across the point patterns. Since each point is assigned to a grid cell, we can interpolate values across the grid and assign an interpolated values back to the points. Remember that the width of the grid is determined by the nx parameter and you can increase the resolution of the interpolation by setting nx to a higher value when running the Create3DStack() function. Increasing the value of this parameter will improve the “smoothness” of the colormap but will slow down the computation significantly.

interpolated.data <- FeaturePlot3D(se, features = "Mbp", return.data = TRUE)

ggplot(interpolated.data, aes(x, 2e3 - y, color = val)) +
  geom_point(size = 0.1) +
  facet_wrap(~z, ncol = 1) +
  theme_void() +
  ggtitle("Mbp") +
  scale_color_gradientn(colours = c("black", "dark blue", "cyan", "yellow", "red", "dark red")) +
  theme(plot.background = element_rect(fill = "black"), 
        plot.title = element_text(colour = "white"), 
        legend.text = element_text(colour = "white"))

Version Author Date
4c48cfa Ludvig Larsson 2020-06-04
23df05c jbergenstrahle 2020-01-11
672191f Ludvig Larsson 2019-12-16


3D plot


To generate 3D plots you can use the visualization functions FeaturePlot3D(), DimPlot3D(), and HSVPlot3D(). Each section will by default be assigned a z coordinate ranging from 1 to N where N is the number of samples. If you wish to change these z coordinates you can use the parameter zcoords to map each section to a new value (note that you need to provide as many z coordinates as the number of samples in your Seurat object).

If you wish to force the sections closer to each other you can add margins to the z axis using the add.margins parameter. This will essentially add empty space below and above the 3D stack and therefore push the sections closer.

Now we are ready to plot features in 3D. We’ll run the FeaturePlot3D() function as above but with return.data = FALSE.


FeaturePlot3D(se, features = "Mbp", dark.theme = TRUE, pt.size = 0.6, pts.downsample = 5e4)


see ?FeaturePlot3D for more plotting alternatives, e.g. the z-distance can be changed to more truthfully represent the actual distance between the sections:


FeaturePlot3D(se, features = "Mbp", dark.theme = TRUE, pt.size = 0.6, add.margins = 2, pts.downsample = 5e4)


Various other features and analysis results can be visualized, e.g. if we previously had performed a factor analysis on the samples, we can for example show theses factors simultaneously using the HSV color coding scheme. Just keep in mind that the factors needs to be non-overlapping. The HSV color scheme can be useful to show mulltiple features simultaneously, but it’s recommended to also explore the features one by one.


HSVPlot3D(se, features = paste0("factor_", c(4,5,7,9,11,13,14,15,18,22,24,25,29,30,31,33,36)), pt.size = 1, dark.theme = T, add.margins = 1)


Multiple 3D plots


The 3D plots are drawn using the plotly R package and you can specify a layout attribute called scene to the FeaturePlot3D() to enable the visualization of multiple 3D plots at the same time. Below we plot the features “Mbp” and “Calb2” in two different scenes and we can then use subplot() to visualize them side by side.


p1 <- FeaturePlot3D(se, features = "Mbp", scene = "scene", cols = c("dark blue", "navyblue", "cyan", "white"), dark.theme = TRUE, add.margins = 1, pts.downsample = 5e4)
p2 <- FeaturePlot3D(se, features = "Calb2", scene = "scene2", cols = c("dark blue", "navyblue", "cyan", "white"), dark.theme = TRUE, add.margins = 1, pts.downsample = 5e4)

plotly::subplot(p1, p2, margin = 0)
 

A work by Joseph Bergenstråhle and Ludvig Larsson

 


sessionInfo()
R version 4.0.0 (2020-04-24)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Mojave 10.14.6

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRblas.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] parallel  stats4    stats     graphics  grDevices utils     datasets 
[8] methods   base     

other attached packages:
 [1] STutility_0.1.0             ggplot2_3.3.0              
 [3] SingleCellExperiment_1.10.1 SummarizedExperiment_1.18.1
 [5] DelayedArray_0.14.0         matrixStats_0.56.0         
 [7] Biobase_2.48.0              GenomicRanges_1.40.0       
 [9] GenomeInfoDb_1.24.0         IRanges_2.22.1             
[11] S4Vectors_0.26.0            BiocGenerics_0.34.0        
[13] Seurat_3.1.5                workflowr_1.6.2            

loaded via a namespace (and not attached):
  [1] reticulate_1.15         tidyselect_1.0.0        htmlwidgets_1.5.1      
  [4] grid_4.0.0              Rtsne_0.15              munsell_0.5.0          
  [7] codetools_0.2-16        ica_1.0-2               units_0.6-6            
 [10] future_1.17.0           miniUI_0.1.1.1          withr_2.2.0            
 [13] colorspace_1.4-1        knitr_1.28              uuid_0.1-4             
 [16] ROCR_1.0-11             tensor_1.5              listenv_0.8.0          
 [19] labeling_0.3            git2r_0.27.1            GenomeInfoDbData_1.2.3 
 [22] polyclip_1.10-0         farver_2.0.3            rprojroot_1.3-2        
 [25] coda_0.19-3             LearnBayes_2.15.1       vctrs_0.3.0            
 [28] xfun_0.13               R6_2.4.1                doParallel_1.0.15      
 [31] rsvd_1.0.3              Morpho_2.8              ggiraph_0.7.0          
 [34] manipulateWidget_0.10.1 bitops_1.0-6            spatstat.utils_1.17-0  
 [37] assertthat_0.2.1        promises_1.1.0          scales_1.1.0           
 [40] imager_0.42.1           gtable_0.3.0            npsurv_0.4-0.1         
 [43] globals_0.12.5          bmp_0.3                 goftest_1.2-2          
 [46] rlang_0.4.6             zeallot_0.1.0           akima_0.6-2            
 [49] systemfonts_0.2.1       splines_4.0.0           lazyeval_0.2.2         
 [52] rgl_0.100.54            yaml_2.2.1              reshape2_1.4.4         
 [55] abind_1.4-5             crosstalk_1.1.0.1       backports_1.1.6        
 [58] httpuv_1.5.2            tools_4.0.0             spData_0.3.5           
 [61] ellipsis_0.3.0          raster_3.1-5            RColorBrewer_1.1-2     
 [64] Rvcg_0.19.1             ggridges_0.5.2          Rcpp_1.0.4.6           
 [67] plyr_1.8.6              zlibbioc_1.34.0         classInt_0.4-3         
 [70] purrr_0.3.4             RCurl_1.98-1.2          rpart_4.1-15           
 [73] dbscan_1.1-5            deldir_0.1-25           viridis_0.5.1          
 [76] pbapply_1.4-2           cowplot_1.0.0           zoo_1.8-8              
 [79] ggrepel_0.8.2           cluster_2.1.0           colorRamps_2.3         
 [82] fs_1.4.1                magrittr_1.5            data.table_1.12.8      
 [85] magick_2.3              readbitmap_0.1.5        gmodels_2.18.1         
 [88] lmtest_0.9-37           RANN_2.6.1              whisker_0.4            
 [91] fitdistrplus_1.0-14     patchwork_1.0.0         shinyjs_1.1            
 [94] lsei_1.2-0.1            mime_0.9                evaluate_0.14          
 [97] xtable_1.8-4            jpeg_0.1-8.1            gridExtra_2.3          
[100] compiler_4.0.0          tibble_3.0.1            KernSmooth_2.23-17     
[103] crayon_1.3.4            htmltools_0.4.0         mgcv_1.8-31            
[106] later_1.0.0             spdep_1.1-3             tiff_0.1-5             
[109] tidyr_1.0.3             expm_0.999-4            DBI_1.1.0              
[112] MASS_7.3-51.6           sf_0.9-3                boot_1.3-25            
[115] Matrix_1.2-18           gdata_2.18.0            igraph_1.2.5           
[118] pkgconfig_2.0.3         sp_1.4-1                plotly_4.9.2.1         
[121] xml2_1.3.2              foreach_1.5.0           webshot_0.5.2          
[124] XVector_0.28.0          stringr_1.4.0           digest_0.6.25          
[127] sctransform_0.2.1       RcppAnnoy_0.0.16        tsne_0.1-3             
[130] spatstat.data_1.4-3     rmarkdown_2.1           leiden_0.3.3           
[133] uwot_0.1.8              gdtools_0.2.2           gtools_3.8.2           
[136] shiny_1.4.0.2           lifecycle_0.2.0         nlme_3.1-147           
[139] jsonlite_1.6.1          viridisLite_0.3.0       pillar_1.4.4           
[142] lattice_0.20-41         fastmap_1.0.1           httr_1.4.1             
[145] survival_3.1-12         glue_1.4.0              spatstat_1.63-3        
[148] png_0.1-7               iterators_1.0.12        class_7.3-17           
[151] stringi_1.4.6           dplyr_0.8.5             irlba_2.3.3            
[154] e1071_1.7-3             future.apply_1.5.0      ape_5.3