Compare commits
6 Commits
a9377f2494
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 0eef1d09d8 | |||
| 9ce48fecce | |||
| 3c8a42a661 | |||
| ff1a7e1ff5 | |||
| 17d700e44e | |||
| e185aa2935 |
@@ -1,2 +1,5 @@
|
||||
# scMonitor
|
||||
|
||||
scMonitor is a shinny application writen in R that allows to easily explore already processed scRNAseq seurat objects.
|
||||
|
||||
You can find a video explanation [here](https://ratg.cat/tutos/scMonitor.html).
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
WEBVTT
|
||||
|
||||
00:00.700 --> 00:02.600
|
||||
In this video, I will present you
|
||||
|
||||
00:02.600 --> 00:05.500
|
||||
the shinny application scMonitor, which is
|
||||
|
||||
00:05.500 --> 00:08.200
|
||||
oriented to easily explore
|
||||
|
||||
00:08.200 --> 00:10.300
|
||||
a previously processed seurat object.
|
||||
|
||||
00:11.600 --> 00:13.800
|
||||
Firstly, you should select the file
|
||||
|
||||
00:13.800 --> 00:16.800
|
||||
containing the seurat object.
|
||||
|
||||
00:16.800 --> 00:19.000
|
||||
For now, the file format must be RDS.
|
||||
|
||||
00:19.700 --> 00:21.600
|
||||
Depending on the object size and
|
||||
|
||||
00:21.600 --> 00:23.800
|
||||
computer potency the loading
|
||||
|
||||
00:23.800 --> 00:25.000
|
||||
will take more or less time.
|
||||
|
||||
00:26.200 --> 00:28.200
|
||||
UMAP distribution that generates
|
||||
|
||||
00:28.400 --> 00:30.000
|
||||
is the same that shows as default,
|
||||
|
||||
00:30.400 --> 00:33.400
|
||||
usually clusters identified by seurat itself.
|
||||
|
||||
00:33.400 --> 00:37.200
|
||||
We can group colors by any
|
||||
|
||||
00:37.200 --> 00:39.300
|
||||
other variable that we have included in the
|
||||
|
||||
00:39.300 --> 00:42.600
|
||||
metadata from the object specifying it in "GroupBy".
|
||||
|
||||
00:43.200 --> 00:45.500
|
||||
Tipically, the sample origin or
|
||||
|
||||
00:45.500 --> 00:46.300
|
||||
a manual annotation
|
||||
|
||||
00:46.300 --> 00:47.700
|
||||
from the cell type.
|
||||
|
||||
00:48.800 --> 00:51.400
|
||||
Distribution can also be divided by
|
||||
|
||||
00:51.400 --> 00:54.500
|
||||
another variable selecting in "FacetBy".
|
||||
|
||||
00:54.500 --> 00:57.300
|
||||
In this case, we are looking at
|
||||
|
||||
00:57.300 --> 00:59.900
|
||||
the distribution of cell type
|
||||
|
||||
00:59.900 --> 01:01.000
|
||||
by the sample origin.
|
||||
|
||||
01:02.800 --> 01:05.800
|
||||
Another available visualization is to show expression
|
||||
|
||||
01:05.800 --> 01:08.100
|
||||
for a group of genes separated by a white space
|
||||
|
||||
01:08.100 --> 01:10.400
|
||||
over UMAP distribution.
|
||||
|
||||
01:11.300 --> 01:13.500
|
||||
With the "Height" bar we can adjust
|
||||
|
||||
01:13.500 --> 01:15.500
|
||||
the size in order to feel comfortable.
|
||||
|
||||
01:18.900 --> 01:22.700
|
||||
Finally, we can create signatures in order to visualize
|
||||
|
||||
01:22.800 --> 01:25.200
|
||||
their score from cells.
|
||||
|
||||
01:25.200 --> 01:27.300
|
||||
One must indicate the signature name and
|
||||
|
||||
01:27.300 --> 01:29.800
|
||||
on the box below specify the genes
|
||||
|
||||
01:29.800 --> 01:32.600
|
||||
that are included. Once added, you can
|
||||
|
||||
01:32.600 --> 01:34.700
|
||||
specify its name in the
|
||||
|
||||
01:34.700 --> 01:35.500
|
||||
signatures box.
|
||||
@@ -0,0 +1,109 @@
|
||||
WEBVTT
|
||||
|
||||
00:00.700 --> 00:02.600
|
||||
En este vídeo os voy a presentar
|
||||
|
||||
00:02.600 --> 00:05.500
|
||||
la aplicación "shinny" scMonitor, que está
|
||||
|
||||
00:05.500 --> 00:08.200
|
||||
orientada a explorar de forma sencilla un
|
||||
|
||||
00:08.200 --> 00:10.300
|
||||
objeto seurat previamente procesado.
|
||||
|
||||
00:11.600 --> 00:13.800
|
||||
Lo primero es seleccionar el fichero que
|
||||
|
||||
00:13.800 --> 00:16.800
|
||||
contiene ese objeto seurat. Por ahora,
|
||||
|
||||
00:16.800 --> 00:19.000
|
||||
el formato del fichero debe RDS.
|
||||
|
||||
00:19.700 --> 00:21.600
|
||||
En función del tamaño del objeto y
|
||||
|
||||
00:21.600 --> 00:23.800
|
||||
de la potencia del ordenador la carga
|
||||
|
||||
00:23.800 --> 00:25.000
|
||||
tardará más o menos.
|
||||
|
||||
00:26.200 --> 00:28.200
|
||||
La distribución UMAP que se genera
|
||||
|
||||
00:28.400 --> 00:30.000
|
||||
es la que se muestra por defecto,
|
||||
|
||||
00:30.400 --> 00:33.400
|
||||
normalmente los "clusters" identificados por el propio seurat.
|
||||
|
||||
00:33.400 --> 00:37.200
|
||||
Podemos agrupar los colores por cualquier
|
||||
|
||||
00:37.200 --> 00:39.300
|
||||
otra variable que hayamos incluido en los
|
||||
|
||||
00:39.300 --> 00:42.600
|
||||
metadatos del objeto especificándolo en "GroupBy".
|
||||
|
||||
00:43.200 --> 00:45.500
|
||||
Típicamente, el origen de la muestra o
|
||||
|
||||
00:45.500 --> 00:46.300
|
||||
una anotación
|
||||
|
||||
00:46.300 --> 00:47.700
|
||||
manual de tipo celular.
|
||||
|
||||
00:48.800 --> 00:51.400
|
||||
También se puede dividir la distribución en
|
||||
|
||||
00:51.400 --> 00:54.500
|
||||
función de una variable seleccionándolo en "FacetBy".
|
||||
|
||||
00:54.500 --> 00:57.300
|
||||
En este caso estamos viendo la
|
||||
|
||||
00:57.300 --> 00:59.900
|
||||
distribución de los tipos celulares en función
|
||||
|
||||
00:59.900 --> 01:01.000
|
||||
del origen de la muestra.
|
||||
|
||||
01:02.800 --> 01:05.800
|
||||
Otra visualización disponible es mostrar la expresión
|
||||
|
||||
01:05.800 --> 01:08.100
|
||||
de conjuntos de genes separados por un
|
||||
|
||||
01:08.100 --> 01:10.400
|
||||
espacio sobre la distribución UMAP.
|
||||
|
||||
01:11.300 --> 01:13.500
|
||||
Con la barra de altura podemos ajustar
|
||||
|
||||
01:13.500 --> 01:15.500
|
||||
el tamaño para que nos sea cómodo.
|
||||
|
||||
01:18.900 --> 01:22.700
|
||||
Finalmente, podemos crear signaturas para luego visualizar
|
||||
|
||||
01:22.800 --> 01:25.200
|
||||
el "score" de las células.
|
||||
|
||||
01:25.200 --> 01:27.300
|
||||
Hay que indicar el nombre de la signatura y
|
||||
|
||||
01:27.300 --> 01:29.800
|
||||
en la casilla inferior especificar los genes
|
||||
|
||||
01:29.800 --> 01:32.600
|
||||
que incluye. Una vez añadida se puede
|
||||
|
||||
01:32.600 --> 01:34.700
|
||||
especificar su nombre en la casilla de
|
||||
|
||||
01:34.700 --> 01:35.500
|
||||
signaturas.
|
||||
Binary file not shown.
+70
-16
@@ -2,6 +2,7 @@ library(shiny)
|
||||
library(Seurat)
|
||||
library(shinyFiles)
|
||||
library(ggplot2)
|
||||
library(ggpubr)
|
||||
|
||||
# Define UI for application
|
||||
ui <- fluidPage(
|
||||
@@ -15,8 +16,13 @@ ui <- fluidPage(
|
||||
uiOutput('groupby'),
|
||||
uiOutput('facetby'),
|
||||
textInput('features', label = "Genes"),
|
||||
textInput('mods', label = "Signatures"),
|
||||
actionButton("goButton", "Query"),
|
||||
sliderInput("height", "Altura", min=1000, max=20000, step=1000, value=6000)
|
||||
sliderInput("height", "Altura", min=1000, max=20000, step=1000, value=6000),
|
||||
h3("Add Signature"),
|
||||
textInput('mod_name', label = "Name"),
|
||||
textInput('mod_feat', label = "Genes"),
|
||||
actionButton("modButton", "Add Signature")
|
||||
),
|
||||
|
||||
mainPanel(
|
||||
@@ -26,11 +32,15 @@ ui <- fluidPage(
|
||||
)
|
||||
)
|
||||
|
||||
# Define server logic required to draw a histogram
|
||||
# Define server logic
|
||||
server <- function(input, output) {
|
||||
|
||||
## Defining reactive values
|
||||
dades<-reactiveValues()
|
||||
dades$seu<-NULL
|
||||
dades$mods<-NULL
|
||||
|
||||
## Conecting with file location and entering Seurat object
|
||||
volumes <- c(Home = fs::path_home(), "R Installation" = R.home(), getVolumes()())
|
||||
shinyFileChoose(input, 'file', roots=volumes)
|
||||
|
||||
@@ -40,6 +50,7 @@ server <- function(input, output) {
|
||||
}
|
||||
})
|
||||
|
||||
## Rendering UI depending on seu meta.data
|
||||
output$groupby<-renderUI({
|
||||
if (!is.null(dades$seu)){
|
||||
selectInput("groupby", "GroupBy", c("Default", colnames(dades$seu@meta.data)))
|
||||
@@ -52,10 +63,7 @@ server <- function(input, output) {
|
||||
}
|
||||
})
|
||||
|
||||
query<-eventReactive(input$goButton,{
|
||||
dades$fet_query<-strsplit(input$features, " ")[[1]]
|
||||
})
|
||||
|
||||
## Render DimPlot
|
||||
output$umapPlot <- renderPlot({
|
||||
observeEvent(dades$seu, {})
|
||||
if (!is.null(dades$seu)){
|
||||
@@ -67,7 +75,22 @@ server <- function(input, output) {
|
||||
plot
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
## Signature - Module Definition
|
||||
observeEvent(input$modButton, {
|
||||
if (input$modButton > 0){
|
||||
mod_list<-strsplit(input$mod_feat, " ")[[1]]
|
||||
mod_list<-mod_list[mod_list %in% rownames(dades$seu)]
|
||||
dades$seu<-AddModuleScore(dades$seu,list(mod_list),
|
||||
name=input$mod_name)
|
||||
}
|
||||
})
|
||||
|
||||
## FeaturePlot construction
|
||||
query<-eventReactive(input$goButton,{
|
||||
dades$fet_query<-strsplit(input$features, " ")[[1]]
|
||||
})
|
||||
|
||||
output$featPlotUI<- renderUI({
|
||||
observeEvent(dades$fet_query, {})
|
||||
if (!is.null(dades$seu)){
|
||||
@@ -75,17 +98,48 @@ server <- function(input, output) {
|
||||
height = paste0(input$height/10,"px"))
|
||||
}
|
||||
})
|
||||
|
||||
output$featPlot<-renderPlot({
|
||||
observeEvent(dades$seu, {})
|
||||
if (!is.null(dades$seu)){
|
||||
query()
|
||||
|
||||
FeaturePlot(dades$seu,
|
||||
split.by=if(input$facetby != "None"){input$facetby}else{NULL},
|
||||
features = dades$fet_query)&theme(aspect.ratio = 1)
|
||||
|
||||
## ModulePlot/SigPlot construction
|
||||
query_mod<-eventReactive(input$goButton,{
|
||||
if (length(strsplit(input$mods, " ")[[1]]) > 0){
|
||||
dades$mods<-paste(strsplit(input$mods, " ")[[1]], "1", sep="")
|
||||
}else{
|
||||
dades$mods<-NULL
|
||||
}
|
||||
})
|
||||
|
||||
output$modPlotUI<- renderUI({
|
||||
observeEvent(dades$mod_name, {})
|
||||
if (!is.null(dades$mod_name)){
|
||||
plotOutput("modPlot",
|
||||
height = paste0(input$height/10,"px"))
|
||||
}
|
||||
})
|
||||
|
||||
## Feature/Mod plot rendering
|
||||
output$featPlot<-renderPlot({
|
||||
observeEvent(input$goButton, {})
|
||||
if (!is.null(dades$seu)){
|
||||
query()
|
||||
plot<-list()
|
||||
print(dades$fet_query)
|
||||
if (length(dades$fet_query) > 0){
|
||||
plot[["Genes"]]<-FeaturePlot(dades$seu,
|
||||
split.by=if(input$facetby != "None"){input$facetby}else{NULL},
|
||||
features = dades$fet_query)&theme(aspect.ratio = 1)
|
||||
}
|
||||
query_mod()
|
||||
print(dades$mods)
|
||||
if (length(dades$mods) > 0){
|
||||
plot[["Mods"]]<-FeaturePlot(dades$seu,
|
||||
split.by=if(input$facetby != "None"){input$facetby}else{NULL},
|
||||
features = dades$mods)&theme(aspect.ratio = 1)&scale_color_viridis_c()
|
||||
}
|
||||
do.call(ggarrange, c(plot, ncol=1))
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
# Run the application
|
||||
|
||||
Reference in New Issue
Block a user