The R markdown is available from the pulldown menu for Code at the upper-right, choose “Download Rmd”, or download the Rmd from GitHub.


In this example, we will import normalized scRNA-seq data and cluster assignments from local files, generate cell plots, perform differential expression analysis based on provided categories, visualize as a combined heatmap and generate networks from the top genes from each category.

Installation

if(!"RCy3" %in% installed.packages()){
    install.packages("BiocManager")
    BiocManager::install("RCy3")
}
library(RCy3)

Required software

RCy3 works by connecting with Cytoscape. You will need to install and launch Cytoscape:

cytoscapePing()

For this vignette, you’ll need the following apps:

#available in Cytoscape 3.7.0 and above
installApp('STRINGapp')
installApp('enhancedGraphics')
installApp('cyBrowser')
installApp('cyPlot')
installApp('scNetViz')

Download test data

You may use your own scRNA-seq data for the next steps. scNetViz accepts standard outputs from an scRNA-seq processing software such as CellRanger as inputs. For illustration, the following chunk downloads and unzips a test data (Accession: E-GEOD-109979) in the same directory as this R Markdown file.

#Download normalized counts
url_1 <- "https://github.com/cytoscape/cytoscape-tutorials/blob/gh-pages/protocols/data/E-GEOD-109979-normalised-files.zip?raw=true"
fname_1 <- "E-GEOD-109979-normalised-files.zip"
download.file(url_1, fname_1)
unzip(fname_1, overwrite=TRUE, exdir="E-GEOD-109979")

#Download category information
url_2 <- "https://raw.githubusercontent.com/cytoscape/cytoscape-tutorials/gh-pages/protocols/data/E-GEOD-109979.clusters.tsv"
fname_2 <- "E-GEOD-109979.clusters.tsv"
download.file(url_2, fname_2)

Load data from local disk

scNetViz expects complete paths for inputs. Load the normalized count matrix in the current Cytoscape session. The directory with normalized counts must have three files only:

  • a file with the count matrix in Matrix Market file format,
  • a file with the the column names, and
  • a file with the the row names.
completeFilePath <- file.path(getwd(), "E-GEOD-109979")

commandToLoadFile <- paste0('scnetviz load experiment file file=',
                            completeFilePath,
                            ' species=Homo sapiens')
RCy3::commandsRun(commandToLoadFile)

Load the category data

completeFilePath <- file.path(getwd(), 
                              "E-GEOD-109979.clusters.tsv")

commandToAddCategory <- paste0('scnetviz add file category file=',
                               completeFilePath)

RCy3::commandsRun(commandToAddCategory)

Generate a UMAP plot

scNetViz identifies the loaded data with the file name that was input, which is E-GEOD-109979 for our case. Next, generate UMAP plot and display it in the Cytoscape session (this step may take several minutes to complete). Note that the indexing of rows in the loaded category file starts with 0.

RCy3::commandsRun('scnetviz calculate UMAP scale=true accession=E-GEOD-109979')

RCy3::commandsRun('scnetviz show cell plot accession=E-GEOD-109979 category=E-GEOD-109979.clusters.tsv categoryRow=0')

Perform differential expression analysis

RCy3::commandsRun('scnetviz calculate diffexp accession=E-GEOD-109979 categoryRow=0')

Generate heatmap

Generate a heatmap showing the top differentially expressed genes.

RCy3::commandsRun('scnetviz show diff plot type=Heatmap')

Fetch interaction networks

Fetch interaction networks from the STRING database.

RCy3::commandsRun('scnetviz create network accession=E-GEOD-109979')
LS0tCnRpdGxlOiAic2NOZXRWaXo6IFlvdXIgT3duIHNjUk5BLVNlcSBEYXRhc2V0IgphdXRob3I6ICJLcmlzaG5hIENob3VkaGFyeSwgQWxleCBQaWNvIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciwgZWNobyA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZXZhbD1GQUxTRQopCmBgYAoqVGhlIFIgbWFya2Rvd24gaXMgYXZhaWxhYmxlIGZyb20gdGhlIHB1bGxkb3duIG1lbnUgZm9yKiBDb2RlICphdCB0aGUgdXBwZXItcmlnaHQsIGNob29zZSAiRG93bmxvYWQgUm1kIiwgb3IgW2Rvd25sb2FkIHRoZSBSbWQgZnJvbSBHaXRIdWJdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9jeXRvc2NhcGUvY3l0b3NjYXBlLWF1dG9tYXRpb24vbWFzdGVyL2Zvci1zY3JpcHRlcnMvUi9ub3RlYm9va3MvdXNlLWNhc2UtMi5SbWQpLioKCjxociAvPgoKSW4gdGhpcyBleGFtcGxlLCB3ZSB3aWxsIGltcG9ydCBub3JtYWxpemVkIHNjUk5BLXNlcSBkYXRhIGFuZCBjbHVzdGVyIGFzc2lnbm1lbnRzIGZyb20gbG9jYWwgZmlsZXMsIGdlbmVyYXRlIGNlbGwgcGxvdHMsIHBlcmZvcm0gZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzaXMgYmFzZWQgb24gcHJvdmlkZWQgY2F0ZWdvcmllcywgdmlzdWFsaXplIGFzIGEgY29tYmluZWQgaGVhdG1hcCBhbmQgZ2VuZXJhdGUgbmV0d29ya3MgZnJvbSB0aGUgdG9wIGdlbmVzIGZyb20gZWFjaCBjYXRlZ29yeS4KCiMgSW5zdGFsbGF0aW9uCmBgYHtyfQppZighIlJDeTMiICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKCkpewogICAgaW5zdGFsbC5wYWNrYWdlcygiQmlvY01hbmFnZXIiKQogICAgQmlvY01hbmFnZXI6Omluc3RhbGwoIlJDeTMiKQp9CmxpYnJhcnkoUkN5MykKYGBgCgojIFJlcXVpcmVkIHNvZnR3YXJlClJDeTMgd29ya3MgYnkgY29ubmVjdGluZyB3aXRoIEN5dG9zY2FwZS4gWW91IHdpbGwgbmVlZCB0byBpbnN0YWxsIGFuZCBsYXVuY2ggQ3l0b3NjYXBlOgoKKiBEb3dubG9hZCB0aGUgbGF0ZXN0IEN5dG9zY2FwZSBmcm9tIGh0dHA6Ly93d3cuY3l0b3NjYXBlLm9yZy9kb3dubG9hZC5waHAKKiBDb21wbGV0ZSBpbnN0YWxsYXRpb24gd2l6YXJkCiogTGF1bmNoIEN5dG9zY2FwZQoKCmBgYHtyfQpjeXRvc2NhcGVQaW5nKCkKYGBgCgpGb3IgdGhpcyB2aWduZXR0ZSwgeW914oCZbGwgbmVlZCB0aGUgZm9sbG93aW5nIGFwcHM6IAoKKiB0aGUgW1NUUklOR10oaHR0cHM6Ly9zdHJpbmctZGIub3JnLykgYXBwLCAKKiB0aGUgW2VuaGFuY2VkR3JhcGhpY3NdKGh0dHBzOi8vd3d3LmNnbC51Y3NmLmVkdS9jeXRvc2NhcGUvdXRpbGl0aWVzMy9lbmhhbmNlZGNnLnNodG1sKSBhcHAsIAoqIHRoZSBbY3lCcm93c2VyXShodHRwczovL3d3dy5jZ2wudWNzZi5lZHUvY3l0b3NjYXBlL3V0aWxpdGllczMvY3licm93c2VyLnNodG1sKSBhcHAsIGFuZAoqIHRoZSBbY3lQbG90XShodHRwOi8vYXBwcy5jeXRvc2NhcGUub3JnL2FwcHMvY3lwbG90KSBhcHAuCgpgYGB7cn0KI2F2YWlsYWJsZSBpbiBDeXRvc2NhcGUgMy43LjAgYW5kIGFib3ZlCmluc3RhbGxBcHAoJ1NUUklOR2FwcCcpCmluc3RhbGxBcHAoJ2VuaGFuY2VkR3JhcGhpY3MnKQppbnN0YWxsQXBwKCdjeUJyb3dzZXInKQppbnN0YWxsQXBwKCdjeVBsb3QnKQppbnN0YWxsQXBwKCdzY05ldFZpeicpCmBgYAoKIyBEb3dubG9hZCB0ZXN0IGRhdGEKCllvdSBtYXkgdXNlIHlvdXIgb3duIHNjUk5BLXNlcSBkYXRhIGZvciB0aGUgbmV4dCBzdGVwcy4gc2NOZXRWaXogYWNjZXB0cyBzdGFuZGFyZCBvdXRwdXRzIGZyb20gYW4gc2NSTkEtc2VxIHByb2Nlc3Npbmcgc29mdHdhcmUgc3VjaCBhcyBDZWxsUmFuZ2VyIGFzIGlucHV0cy4gRm9yIGlsbHVzdHJhdGlvbiwgdGhlIGZvbGxvd2luZyBjaHVuayBkb3dubG9hZHMgYW5kIHVuemlwcyBhIHRlc3QgZGF0YSAoW0FjY2Vzc2lvbjogRS1HRU9ELTEwOTk3OV0oaHR0cHM6Ly93d3cuZWJpLmFjLnVrL2d4YS9zYy9leHBlcmltZW50cy9FLUdFT0QtMTA5OTc5L2Rvd25sb2FkcykpIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGlzIFIgTWFya2Rvd24gZmlsZS4KCmBgYHtyfQojRG93bmxvYWQgbm9ybWFsaXplZCBjb3VudHMKdXJsXzEgPC0gImh0dHBzOi8vZ2l0aHViLmNvbS9jeXRvc2NhcGUvY3l0b3NjYXBlLXR1dG9yaWFscy9ibG9iL2doLXBhZ2VzL3Byb3RvY29scy9kYXRhL0UtR0VPRC0xMDk5Nzktbm9ybWFsaXNlZC1maWxlcy56aXA/cmF3PXRydWUiCmZuYW1lXzEgPC0gIkUtR0VPRC0xMDk5Nzktbm9ybWFsaXNlZC1maWxlcy56aXAiCmRvd25sb2FkLmZpbGUodXJsXzEsIGZuYW1lXzEpCnVuemlwKGZuYW1lXzEsIG92ZXJ3cml0ZT1UUlVFLCBleGRpcj0iRS1HRU9ELTEwOTk3OSIpCgojRG93bmxvYWQgY2F0ZWdvcnkgaW5mb3JtYXRpb24KdXJsXzIgPC0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9jeXRvc2NhcGUvY3l0b3NjYXBlLXR1dG9yaWFscy9naC1wYWdlcy9wcm90b2NvbHMvZGF0YS9FLUdFT0QtMTA5OTc5LmNsdXN0ZXJzLnRzdiIKZm5hbWVfMiA8LSAiRS1HRU9ELTEwOTk3OS5jbHVzdGVycy50c3YiCmRvd25sb2FkLmZpbGUodXJsXzIsIGZuYW1lXzIpCmBgYAoKIyBMb2FkIGRhdGEgZnJvbSBsb2NhbCBkaXNrCgpzY05ldFZpeiBleHBlY3RzIGNvbXBsZXRlIHBhdGhzIGZvciBpbnB1dHMuIExvYWQgdGhlIG5vcm1hbGl6ZWQgY291bnQgbWF0cml4IGluIHRoZSBjdXJyZW50IEN5dG9zY2FwZSBzZXNzaW9uLiBUaGUgZGlyZWN0b3J5IHdpdGggbm9ybWFsaXplZCBjb3VudHMgbXVzdCBoYXZlIHRocmVlIGZpbGVzIG9ubHk6CgoqIGEgZmlsZSB3aXRoIHRoZSBjb3VudCBtYXRyaXggaW4gTWF0cml4IE1hcmtldCBmaWxlIGZvcm1hdCwgCiogYSBmaWxlIHdpdGggdGhlIHRoZSBjb2x1bW4gbmFtZXMsIGFuZCAKKiBhIGZpbGUgd2l0aCB0aGUgdGhlIHJvdyBuYW1lcy4KCmBgYHtyfQpjb21wbGV0ZUZpbGVQYXRoIDwtIGZpbGUucGF0aChnZXR3ZCgpLCAiRS1HRU9ELTEwOTk3OSIpCgpjb21tYW5kVG9Mb2FkRmlsZSA8LSBwYXN0ZTAoJ3NjbmV0dml6IGxvYWQgZXhwZXJpbWVudCBmaWxlIGZpbGU9JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlRmlsZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHNwZWNpZXM9SG9tbyBzYXBpZW5zJykKUkN5Mzo6Y29tbWFuZHNSdW4oY29tbWFuZFRvTG9hZEZpbGUpCmBgYAoKCiMgTG9hZCB0aGUgY2F0ZWdvcnkgZGF0YQoKYGBge3J9CmNvbXBsZXRlRmlsZVBhdGggPC0gZmlsZS5wYXRoKGdldHdkKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRS1HRU9ELTEwOTk3OS5jbHVzdGVycy50c3YiKQoKY29tbWFuZFRvQWRkQ2F0ZWdvcnkgPC0gcGFzdGUwKCdzY25ldHZpeiBhZGQgZmlsZSBjYXRlZ29yeSBmaWxlPScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUZpbGVQYXRoKQoKUkN5Mzo6Y29tbWFuZHNSdW4oY29tbWFuZFRvQWRkQ2F0ZWdvcnkpCmBgYAoKCiMgR2VuZXJhdGUgYSBVTUFQIHBsb3QKCnNjTmV0Vml6IGlkZW50aWZpZXMgdGhlIGxvYWRlZCBkYXRhIHdpdGggdGhlIGZpbGUgbmFtZSB0aGF0IHdhcyBpbnB1dCwgd2hpY2ggaXMgYEUtR0VPRC0xMDk5NzlgIGZvciBvdXIgY2FzZS4gTmV4dCwgZ2VuZXJhdGUgVU1BUCBwbG90IGFuZCBkaXNwbGF5IGl0IGluIHRoZSBDeXRvc2NhcGUgc2Vzc2lvbiAodGhpcyBzdGVwIG1heSB0YWtlIHNldmVyYWwgbWludXRlcyB0byBjb21wbGV0ZSkuIE5vdGUgdGhhdCB0aGUgaW5kZXhpbmcgb2Ygcm93cyBpbiB0aGUgbG9hZGVkIGNhdGVnb3J5IGZpbGUgc3RhcnRzIHdpdGggMC4KCmBgYHtyfQpSQ3kzOjpjb21tYW5kc1J1bignc2NuZXR2aXogY2FsY3VsYXRlIFVNQVAgc2NhbGU9dHJ1ZSBhY2Nlc3Npb249RS1HRU9ELTEwOTk3OScpCgpSQ3kzOjpjb21tYW5kc1J1bignc2NuZXR2aXogc2hvdyBjZWxsIHBsb3QgYWNjZXNzaW9uPUUtR0VPRC0xMDk5NzkgY2F0ZWdvcnk9RS1HRU9ELTEwOTk3OS5jbHVzdGVycy50c3YgY2F0ZWdvcnlSb3c9MCcpCmBgYAoKIyBQZXJmb3JtIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2lzCgpgYGB7cn0KUkN5Mzo6Y29tbWFuZHNSdW4oJ3NjbmV0dml6IGNhbGN1bGF0ZSBkaWZmZXhwIGFjY2Vzc2lvbj1FLUdFT0QtMTA5OTc5IGNhdGVnb3J5Um93PTAnKQpgYGAKCiMgR2VuZXJhdGUgaGVhdG1hcAoKR2VuZXJhdGUgYSBoZWF0bWFwIHNob3dpbmcgdGhlIHRvcCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMuCgpgYGB7cn0KUkN5Mzo6Y29tbWFuZHNSdW4oJ3NjbmV0dml6IHNob3cgZGlmZiBwbG90IHR5cGU9SGVhdG1hcCcpCmBgYAoKIyBGZXRjaCBpbnRlcmFjdGlvbiBuZXR3b3JrcwoKRmV0Y2ggaW50ZXJhY3Rpb24gbmV0d29ya3MgZnJvbSB0aGUgW1NUUklOR10oaHR0cHM6Ly9zdHJpbmctZGIub3JnLykgZGF0YWJhc2UuCgpgYGB7cn0KUkN5Mzo6Y29tbWFuZHNSdW4oJ3NjbmV0dml6IGNyZWF0ZSBuZXR3b3JrIGFjY2Vzc2lvbj1FLUdFT0QtMTA5OTc5JykKYGBgCg==