Bioconductor contributions
Package | BioC-devel | BioC-release |
---|---|---|
gDRstyle | ||
gDRtestData | ||
gDRutils | ||
gDRcore | ||
gDRimport | ||
gDR | ||
igvR | ||
BrowserViz | ||
igvShiny | - |
An htmlwidget version of igv, for RStudio and Shiny apps
Home Page: https://gladkia.github.io/igvShiny/
License: Other
Package | BioC-devel | BioC-release |
---|---|---|
gDRstyle | ||
gDRtestData | ||
gDRutils | ||
gDRcore | ||
gDRimport | ||
gDR | ||
igvR | ||
BrowserViz | ||
igvShiny | - |
Hi Paul,
Thank you very much for developing this wonderful package to browse genome in R Shiny.
I have some questions about when set genomeName for "remote" or "local" in igvShiny( ) for custom genome.
Is any function like loadVcfTrack such as "loadAnnotationTrack" to loading Annotation track from gtf/gff3 or rtracklayer object?
It will be helpful for custom genome setting in igvShiny.
Another question is genomeName, it will change to "remote" mabye it can be a setting genome id like igvR setCustomGenome?
Best,
Chi Kao
This package is really interesting! I'm having a really tough time getting the widget to load and importing bed files to it. Would you mind giving a brief example of how to operate the package within a Shiny app?
Thank you!
Hi Paul,
My app is getting this error whenever igv is loading:
[1] --- leaving igvShiny.R, renderIgvShiny
Warning: Error in igvShiny::parseAndValidateGenomeSpec: Your genome 'hg19' is not currently supported
Currently supported:
99: stop
98: igvShiny::parseAndValidateGenomeSpec
97: ::
htmlwidgets
shinyRenderWidget [/Users/heimann/Documents/cri_iatlas/iatlas-app/R/germline_gwas_server.R#64]
It's important to us to use this genome version, as our app is mirroring a publication that used this assembly. Is there a reason to stop supporting this version?
Thanks!
I cant seem to get anything to actually show when my IGV is rendered. The logs seem to be correct, but nothing is outputed as a reference.
output$igvShiny_0 <- renderIgvShiny({
igvShiny(options = list(genomeName = "local",
fasta = "/Users/jerem/Pipelines/nf-crisprdesign/vizapp/loxAfr3/Loxodonta_africana.loxAfr3.dna.toplevel.fa",
index = "/Users/jerem/Pipelines/nf-crisprdesign/vizapp/loxAfr3/Loxodonta_africana.loxAfr3.dna.toplevel.fa.fai",
initialLocus="",
displayMode = "EXPANDED"))
})
Also, for 'remote' many fastas are kept in gzip format. Could you add the ability to input and read .fa.gz and .fa.gz.fai (example below)
output$igvShiny_0 <- renderIgvShiny({
igvShiny(options = list(genomeName = "remote",
fasta = "http://ftp.ensembl.org/pub/release-106/fasta/homo_sapiens/dna_index/Homo_sapiens.GRCh38.dna.toplevel.fa.gz",
index = "http://ftp.ensembl.org/pub/release-106/fasta/homo_sapiens/dna_index/Homo_sapiens.GRCh38.dna.toplevel.fa.gz.fai",
initialLocus="",
displayMode = "EXPANDED"))
})
Hey Paul,
Thanks for the great work. Could you provide a simple app.R that utilizes your package?
thanks,
Matt
hi Paul,
This is a great widget!
I am wondering why you are using message.region
here? For your demos I think you had it right with message.roi
https://github.com/paul-shannon/igvShiny/blob/cb876ac2b7822fb81f9b7ea3b061895ffa4b7fd4/inst/htmlwidgets/igvShiny.js#L188
reviewing the documentation, tests, and demos, I can find no example of providing values for the tracks
option to igvShiny
function.
Its documentation reads:
tracks: a list of track specifications to be created and displayed at startup
but does not advise what a track specifications
is.
Upon reviewing the code, AFAICT, the tracks
option is ignored.
Hello, this looks great. Would it be possible to have a working example? Thanks
Hi, does igvShiny have a track feature for GWAS catalog and GTEX?
Hi @paul-shannon!
I am very interested in using igvShiny to display GWAS results. During my initial attempts at implementing it, I came across some initial questions/suggestions.
1. Add GWAS track in a Shiny module
In igvShinyDemo-withModules.R
I found that appending a session$ns()
in the id was enough to load the GWAS track:
observeEvent(input$addGwasTrackButton, {
printf("---- addGWASTrack")
printf("current working directory: %s", getwd())
showGenomicRegion(session, id=session$ns("igvShiny_0"), "chr19:45,248,108-45,564,645")
loadGwasTrack(session, id=session$ns("igvShiny_0"), trackName="gwas", tbl=tbl.gwas, deleteTracksOfSameName=FALSE)
})
It is worth noting that this same change worked partially to the other tracks (a box for the track is added, but no data is displayed). We discussed about Shiny modules in the past, and I was wondering if you have any suggestions on this topic.
2. folder /tracks
How do you recommend dealing with the /tracks folder that is created by the GWAS track? I see on igvShinyDemo.R
that there is some code to create the folder, but I would be interested in making sure that this folder is cleaned after each session.
3. GWAS track added as default at IGV start
Is there a way to load the GWAS track as default? I imagine that it would be an argument to the igvShiny
call at renderIgvShiny
, but I didn't figure out how to do that.
Thanks!
Hi, I've been working on implementing IGV in a Shiny app and started with using igvShiny, but I've moved to trying your other package igvR because of its setCustomGenome
function. We'd like to use igvShiny instead because of its integration with Shiny, but we need it for other genomes that aren't supported. We saw this request and were wondering if it would be possible to implement something like setCustomGenome
in igvShiny. Thanks!
Hi,
I am using your example to show bam/cram files from WES data. I wonder if it is a bug that the locally loaded bam file does not show any mismatches:
I already implemented this function to load our mapped WES data, which we stored as BAM file. Using the ScanBamParam(which=region.GRanges) I can now efficiently load data from rather huge bam files.
Unfortunately, also here I do not find any mismatch but only Insertions highlighted. Is this a bug in some igvshiny function or rather a feature of the local bam files including mine? Do I have to modify my bam file to visualize mismatches ?
Best,
Christian
Reduce the complexity of the examples in the vignette by adding a folder argument for predetermined files in parseAndValidateGenomeSpec
.
@chikao0817 asked this question.
This arises from the design of igvShiny:
displayTrack
writes files (often bed files) to a local directory visible to the small webserver embedded in igvShinyHi Paul,
I've found a weird issue that I'm not even sure is an igvShiny issue, but since it seems that some sort of interaction is happening with this package and cyjShiny, I thought you might have some idea of what is going on here.
Steps to reproduce the issue:
If you restart the app and switch steps 2 and 3, you'll see the IGV plot, but not the cyjShiny network. I tried removing the animation from shinycssloaders::withSpinner(.)
as the javascript console showed some tags that I believe are associated with that, but the problem persists.
Hi Paul,
Thanks a lot for adding gff3 track develop. It was very useful ๐ .
But I found some issue about load local fasta file in igvShiny.
Maybe this bug or limit is about igv.js load local fasta from server.
I test two local fasta genome from ENSEMBL PLANT database and Solgenomic Network for igvShiny.
First, the Solanum lycopersicum genome.
S_lycopersicum_chromosomes.3.00.fa file size is around 803 Mb.
Second, the Oryza sativa genome.
Oryza_sativa.IRGSP-1.0.dna.toplevel.fa file size is around 364 Mb.
When app run in Rstudio local apps (127.0.0.1:4094)
Both two genome can show base information like figure.
Loading much time and before loading base information
show WARNING: range-byte header was ignored for url info like issue.
#23
But when app run in rstudio-server in local server (192.168.100.6:3838)
Oryza sativa genome works fine, but Solanum lycopersicum genome didn't jump warning message
and also can't show base information like figure.
I guess this maybe a local file size issue for igvShiny base on igv.js.
Additionally, issue about range-byte header was ignored for url in igv.js happend in some local file upload.
igvteam/igv.js#680
igvteam/igv.js#1049
When I upload Solanum lycopersicum local fasta to IGV App
It didn't jump range-byte header was ignored for url and base information looks great.
Is about different version for igv.js? or java version? for local url.
I also upload this two genome fasta and fai in gdrive.
Hope this issue will help.
Best regards,
Kao Chi
Paul, thanks for the awesome work with this package!
igvShinyDemo.R
was enough to help me get started using this resource, but I ran into one use case that might involve functions that I am not aware of.
I am interested in storing the genomic region as a reactive object, and use this information to link IGV with other visualizations in my app.
The end result is similar to what in the igvShinyDemo.R
app is achieved with the getChrmLoc
button, but with chromLocRegion
being reactive to any change in selection instead of being triggered by a button. I've tried to adapt the code related to getChrmLoc
, such as:
region_track <- reactive({
printf("--- getChromLoc event")
igvShiny::getGenomicRegion(session, id="igv_plot")
})
observeEvent(region_track(), {
printf("--- currentGenomicRegion event")
chromLocRegion <- input$currentGenomicRegion
chromLocRegion
})
but I had no success with that.
Alternatively, I see that I could also get this information updated if there is any way to listen to events linked to clicks of the magnifying glass at the IGV search bar.
Is there any way to implement either of these approaches?
Hi,
I have not checked my Shiny-Scripts since a while. Today I see that I get an error with igvShiny when I try to load the genome:
genomeSpec <- parseAndValidateGenomeSpec("hg38", "APOE")
Error in parseAndValidateGenomeSpec("hg38", "APOE") :
Your genome 'hg38' is not currently supported
Currently supported:
I am running igvShiny_1.5.1. Do you have an idea what could be wrong?
Best,
Christian
Hello Paul!
Thank you for this great idea! It is almost what I need!
I am trying to create IGV shiny widget on my app to visualise my bam files (whole exome data).
Do you think it is possible to adapt your code for that?
There appears to be some debugging/testing code left in Shiny.addCustomMessageHandler("fubar", which is responsible for rewriting the url to a hardcoded value, as can be seen in the javascript console:
Perhaps I should not be working off master?
FWIW: I am trying to suss out how to load a bigbed file by URL and could use some guidance...
=== loadBedGraphTrackFromURL
igvShiny.js:7
{elementID: 'igvShiny_0', trackName: 'meme.ame.all.shuffle', url: 'http://webfs/Sci/SCI-003911-GPFGRIZ/sequenceanalysis/run8/PRLT/meme/ame/shuffle/all.shuffle.bb', color: 'gray', trackHeight: 30, โฆ}
igvShiny.js:521 --- loading bedGraphTrackFromURL
igvShiny.js:522
{url: 'https://www.encodeproject.org/files/ENCFF000ASF/@@download/ENCFF000ASF.bigWig', name: 'GM12878 H3K4me3', color: 'rgb(200,0,0)', autoscaleGroup: '1'}
autoscaleGroup
:
"1"
color
:
"rgb(200,0,0)"
format
:
"bigwig"
name
:
"GM12878 H3K4me3"
type
:
"wig"
url
:
"https://www.encodeproject.org/files/ENCFF000ASF/@@download/ENCFF000ASF.bigWig"
[[Prototype]]
:
Object
Hello,
I'm testing /inst/demos/igvShinyDemo.R with tumor.bam you've provided, however, I get the following error followed by a crash of the application. I can see that the file loaded since:
x <- readGAlignments(bamFile)
print(head(x))
returns lines from bam, so it's able to load the file. There must be a problem with loadBamTrackFromLocalData?
Error in as.character: cannot coerce type 'closure' to vector of type 'character'
I've tried my own local bam file and got the same result.
Thank you for your help.
Really a huge fan of what you have created here. I have stumbled on this package hours after your recent commit, and have some notes from a first user of new functionality:
Nonetheless, great work. Will continue to forward some bugs when I find them.
HI @paul-shannon,
I've observed an unexpected behavior with igvShiny when it is placed in a shinydashboard page.
The following gist reproduces the issue: https://gist.github.com/heimannch/58ebd235327dd34b90c764bd19e2a91c
(that is the code in igvShinyDemo-withModules.R, with the UI using shinydashboard)
When this code is run at first (after startup or restarting R), the igv plot is not completely inside its box, and the behavior persists if I add/delete tracks:
Quite interestingly, if I close the app and start it again, everything is ok, and the box resizes when new tracks are added/deleted:
I've tried setting the height values in the igvShiny calls, but the problem persists. Do you have any idea of what might be happening?
@heimannch @ChristianRohde @JAMKuttan
I merged the customGenomes branch into master, creating igvShiny version 1.5.1
The full details on specifying a custom genome can be seen in
inst/demos/customGenomes/customGenome-localFiles-sars.R
inst/demos/customGenomes/customGenome-remoteFiles-sars.R
When you use a stock genome - 35 are currently provided by the igv team - here's what you do:
then when you call the igvShiny constructor in your shiny server function, create a genome spec with almost all parameters taking default values:
genomeOptions <- parseAndValidateGenomeSpec(genomeName="hg38", initialLocus="NDUFS2")
x <- igvShiny(genomeOptions,
displayMode="SQUISHED",
tracks=list()
)
@heimannch make these observations:
Hi @paul-shannon,
I just submitted a PR with a suggestion of an approach to send the namespace from the Shiny session to igvShiny. This will only take care of the events that had the namespace hardcoded in the code - ie, functions to add other tracks, such as loadGwasTrack, still need to have session$ns() appended in the id parameter. I think a similar approach to what is in the PR can be used to solve that issue, but I still need to figure out how.
HI @paul-shannon,
Wondering if one could specify the itemRGB column for the bed file to be able to color code different elements?
As noted here:
https://github.com/gladkia/igvShiny/blob/master/R/igvShiny.R#L79
This would allow the use of tmp directories and seamless cleanup by apps.
in the widget definition you probably mean "local.url"
.
In my hands, igvShiny/inst/demos/tiny. works in R 4.2.0 as provided (using genomeName="hg38"
).
I installed earlier today with remotes::install_github("paul-shannon/igvShiny")
From the documentation, I expect it should work with many other of the currently.supported.stock.genomes()
.
However, for me, changing to another stock genome with genomeName="danRer11"
(or: sacCer3 hg19 dm3 dm6 chm13v2.0), fails with:
igvShiny.js:66 Uncaught TypeError: Cannot read properties of null (reading 'height')
at Object.renderValue (igvShiny.js:66:77)
at Object.renderValue (htmlwidgets.js:886:25)
at shinyBinding.renderValue (htmlwidgets.js:541:20)
at e.value (outputBinding.ts:48:12)
at delegator.<computed> [as onValueChange] (htmlwidgets.js:112:23)
at e.value (outputAdapter.ts:38:20)
at e.value (shinyapp.ts:559:17)
at e.<anonymous> (shinyapp.ts:736:20)
at e.value (shinyapp.ts:717:29)
at e.value (shinyapp.ts:700:12)
renderValue @ igvShiny.js:66
renderValue @ htmlwidgets.js:886
shinyBinding.renderValue @ htmlwidgets.js:541
value @ outputBinding.ts:48
delegator.<computed> @ htmlwidgets.js:112
value @ outputAdapter.ts:38
value @ shinyapp.ts:559
(anonymous) @ shinyapp.ts:736
value @ shinyapp.ts:717
value @ shinyapp.ts:700
i.onmessage @ shinyapp.ts:350
This is under Google Chrome (Version 105.0.5195.127 (Official Build) (64-bit)) .
Additionally there are warnings in the console of:
DevTools failed to load source map: Could not load content for http://hd1991356yb:9998/igv-ui-1_3_0.css.map: HTTP error: status code 404, net::ERR_HTTP_RESPONSE_CODE_FAILURE
DevTools failed to load source map: Could not load content for http://hd1991356yb:9998/circular-view.css.map: HTTP error: status code 404, net::ERR_HTTP_RESPONSE_CODE_FAILURE
DevTools failed to load source map: Could not load content for http://hd1991356yb:9998/dom.css.map: HTTP error: status code 404, net::ERR_HTTP_RESPONSE_CODE_FAILURE
but these warnings are also present with "hg38".
The issue persists after updating all packages:
sessionInfo()
R version 4.2.0 (2022-04-22)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)
Matrix products: default
BLAS: /n/apps/CentOS7/install/r-4.2.0/lib64/R/lib/libRblas.so
LAPACK: /n/apps/CentOS7/install/r-4.2.0/lib64/R/lib/libRlapack.so
locale:
[1] C
attached base packages:
[1] stats4 stats graphics grDevices utils datasets methods
[8] base
other attached packages:
[1] igvShiny_1.5.6 htmlwidgets_1.5.4 rtracklayer_1.56.1
[4] GenomeInfoDbData_1.2.8 GenomicRanges_1.48.0 GenomeInfoDb_1.32.3
[7] IRanges_2.30.1 S4Vectors_0.34.0 BiocGenerics_0.42.0
[10] shiny_1.7.2
loaded via a namespace (and not attached):
[1] Rcpp_1.0.9 lattice_0.20-45
[3] Rsamtools_2.12.0 Biostrings_2.64.1
[5] digest_0.6.29 V8_4.2.1
[7] mime_0.12 R6_2.5.1
[9] httr_1.4.4 zlibbioc_1.42.0
[11] rlang_1.0.6 curl_4.3.2
[13] jquerylib_0.1.4 Matrix_1.5-1
[15] randomcoloR_1.1.0.1 BiocParallel_1.30.3
[17] Rtsne_0.16 stringr_1.4.1
[19] RCurl_1.98-1.9 munsell_0.5.0
[21] DelayedArray_0.22.0 compiler_4.2.0
[23] httpuv_1.6.6 htmltools_0.5.3
[25] SummarizedExperiment_1.26.1 codetools_0.2-18
[27] matrixStats_0.62.0 XML_3.99-0.11
[29] crayon_1.5.2 later_1.3.0
[31] GenomicAlignments_1.32.1 bitops_1.0-7
[33] grid_4.2.0 jsonlite_1.8.2
[35] xtable_1.8-4 lifecycle_1.0.2
[37] magrittr_2.0.3 scales_1.2.1
[39] cli_3.4.1 stringi_1.7.8
[41] cachem_1.0.6 XVector_0.36.0
[43] promises_1.2.0.1 bslib_0.4.0
[45] ellipsis_0.3.2 rjson_0.2.21
[47] restfulr_0.0.15 tools_4.2.0
[49] Biobase_2.56.0 MatrixGenerics_1.8.1
[51] parallel_4.2.0 fastmap_1.1.0
[53] yaml_2.3.5 colorspace_2.0-3
[55] cluster_2.1.4 memoise_2.0.1
[57] sass_0.4.2 BiocIO_1.6.0
I tried it in R 4.1.2 and still get
Uncaught TypeError: Cannot read properties of null (reading 'height')
at Object.renderValue (igvShiny.js:66:77)
at Object.renderValue (htmlwidgets.js:886:25)
at shinyBinding.renderValue (htmlwidgets.js:541:20)
at e.value (outputBinding.ts:48:12)
at delegator.<computed> [as onValueChange] (htmlwidgets.js:112:23)
at e.value (outputAdapter.ts:38:20)
at e.value (shinyapp.ts:559:17)
at e.<anonymous> (shinyapp.ts:736:20)
at e.value (shinyapp.ts:717:29)
at e.value (shinyapp.ts:700:12)
again with updated packages:
sessionInfo()
R version 4.1.2 (2021-11-01)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)
Matrix products: default
BLAS: /n/apps/CentOS7/install/r-4.1.2/lib64/R/lib/libRblas.so
LAPACK: /n/apps/CentOS7/install/r-4.1.2/lib64/R/lib/libRlapack.so
locale:
[1] LC_CTYPE=en_US.utf8 LC_NUMERIC=C
[3] LC_TIME=en_US.utf8 LC_COLLATE=en_US.utf8
[5] LC_MONETARY=en_US.utf8 LC_MESSAGES=en_US.utf8
[7] LC_PAPER=en_US.utf8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.utf8 LC_IDENTIFICATION=C
attached base packages:
[1] stats4 stats graphics grDevices utils datasets methods
[8] base
other attached packages:
[1] igvShiny_1.5.6 htmlwidgets_1.5.4 rtracklayer_1.57.0
[4] GenomeInfoDbData_1.2.7 GenomicRanges_1.46.1 GenomeInfoDb_1.30.1
[7] IRanges_2.28.0 S4Vectors_0.30.2 BiocGenerics_0.40.0
[10] shiny_1.7.2
loaded via a namespace (and not attached):
[1] SummarizedExperiment_1.24.0 bslib_0.4.0
[3] lattice_0.20-45 V8_4.2.1
[5] colorspace_2.0-3 htmltools_0.5.3
[7] yaml_2.3.5 XML_3.99-0.9
[9] rlang_1.0.1 jquerylib_0.1.4
[11] later_1.3.0 BiocParallel_1.28.3
[13] randomcoloR_1.1.0.1 matrixStats_0.62.0
[15] lifecycle_1.0.1 stringr_1.4.1
[17] zlibbioc_1.40.0 MatrixGenerics_1.6.0
[19] Biostrings_2.62.0 munsell_0.5.0
[21] memoise_2.0.1 restfulr_0.0.13
[23] Biobase_2.54.0 fastmap_1.1.0
[25] httpuv_1.6.6 parallel_4.1.2
[27] curl_4.3.2 Rcpp_1.0.8
[29] xtable_1.8-4 promises_1.2.0.1
[31] scales_1.2.1 cachem_1.0.6
[33] DelayedArray_0.20.0 jsonlite_1.8.2
[35] XVector_0.34.0 mime_0.12
[37] Rsamtools_2.10.0 rjson_0.2.21
[39] digest_0.6.29 stringi_1.7.8
[41] Rtsne_0.16 BiocIO_1.4.0
[43] grid_4.1.2 cli_3.3.0
[45] tools_4.1.2 bitops_1.0-7
[47] sass_0.4.2 magrittr_2.0.3
[49] RCurl_1.98-1.6 cluster_2.1.2
[51] crayon_1.5.2 ellipsis_0.3.2
[53] Matrix_1.4-1 httr_1.4.4
[55] R6_2.5.1 GenomicAlignments_1.30.0
[57] compiler_4.1.2
Similarly, igvShinyDemo.R fails when changing hg38 to e.g. danRer11.
What other diagnostics can I provide?
Or am I just using it incorrectly?
@ChristianRohde thank you for the bug report. This feature works find in base igv.js, so the problem is mine to fix, in my code.
I put some time in on this just now, to no avail. I need to dig deeper into the problem. Unfortunately I am tied up all week, so cannot get to this right away.
I hope that the workaround I suggested here is enough for now.
I am using igvShiny in my app and I've notice that it is demanding a lot of memory.
My application uses the following tracks:
I imagine that some of the current package dependencies are not necessary for these tracks - would it be possible to control the dependencies based on the widget resources being used?
Thanks!
Hi,
this is not an issue but rather a question: I started to use igvShiny to visualize peak regions in bed format. This works very well for background & regulated. Thank you so much for this software!
In IGV I usually inspect single sample files from each 3 x IP + IgG + input as normalized tracks generated with deeptools bamCoverage. The important point is: the scale is grouped within all samples. Do you think this would be possible as well in igvShiny?
Best,
Christian
Hi @paul-shannon!
Last year, I pointed you out an issue about a color bug for GWAS tracks in igvR (the whole story here). It is still there in igvShiny. As you mentioned in the post, the igv.js team updated their code to solve the issue, so it could be great to get an update of that part of the code to use it in igvShiny.
Nevertheless, I actually found your code implementation way simpler to use. It could be nice to add this feature to the GWASTrack
function of the igvShiny package.
Again, thank you so much for your hard work on these packages, and for keeping them maintained.
Have a nice day,
Best regards - Savvy
@vjcitn - new issue to ease tracking.
emulate these parameters in igvR:
track <- GWASTrack("gwas 5k", tbl.gwas, chrom.col=12, pos.col=13, pval.col=28)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.