Git Product home page Git Product logo

tidyqpcr's Introduction

Project Status: Active – The project has reached a stable, usable state and is being actively developed. Codecov test coverage fair-software.eu CII Best Practices CRAN_Status_Badge R-CMD-check rOpenSci peer-review

tidyqpcr - Quantitative PCR analysis in the tidyverse.

Empowering scientists to conduct reproducible, flexible, and MIQE best-practice compliant quantitative PCR analysis.

Contents

Motivation

Quantitative Polymerase Chain Reaction (qPCR) is a highly adaptable experimental technique used across biology and medicine to measure the amounts of nucleic acids (DNA or RNA). tidyqpcr is a software package for qPCR data analysis that builds on the tidyverse collection of data science tools in the R programming language.

Empowering

tidyqpcr combines a free, open-source qPCR analysis R package with online teaching materials.

We want our users to be able to know and understand what happens at every step of their analysis. Users are able to know what occurs at each step as all tidyqpcr tools are open source and follow the FAIR principles - Findable, Accessible, Interoperable, and Reusable. Users should also find each step understandable as we aim to produce educational resources as extensions of data carpentry workshops, such as Data Analysis and Visualization in R for Ecologists, accessible to beginner programmers.

Reproducible

tidyqpcr scripts produce paper-ready figures straight from raw data with identical results across computers.

We want to promote reproducible research so collaborators, reviewers or students can easily confirm and extend results and conclusions. tidyqpcr analysis will repeat exactly on different computers, enabling scientists to share raw data and analysis scripts rather than just processed figures. An R or R markdown script using tidyqpcr to analyse a set of qPCR data could be directly uploaded to a repository such as figshare, as encouraged by many journal publishers.

Flexible

tidyqpcr follows the 'tidy' data paradigm to ensure scalability and adaptability.

We want to create a tool that is flexible enough to analyse high or low throughput experimental data whilst integrating easily into other data analyses. tidyqpcr uses powerful generic data science tools from the tidyverse R package, lightly overlaid with qPCR-specific scripts. As far as possible, every object in tidyqpcr is stored as a generic tibble / data frame. Manipulating and plotting qPCR data without creating bespoke data structures allows tidyqpcr scripts to be easily integrated and scaled according to the needs of your experiments.

Best-practice compliant

tidyqpcr encourages standardised, reliable experimental design by following the Minimum Information for Publication of Quantitative Real-Time PCR Experiments (MIQE) best practices.

We want to make it easier for scientists to produce reliable and interpretable results. The MIQE best practices are a framework to facilitate the full disclosure of all reagents, sequences, and analysis methods necessary to enable other investigators to reproduce results. The final version of tidyqpcr will, by default, request the relevant experimental conditions and assay characteristics, as described in the MIQE guidelines, to allow reviewers/readers to rigorously assess the validity of a result. See "Future Priorities" below to get updates on tidyqpcr's MIQE compliant features.

Getting started

Installing tidyqpcr

First install R.

For Windows users

Next, you need a working installation of Rtools.

Jeffrey Leek made slides on installation and testing of Rtools.

Install via devtools (for all R users)

Install the devtools R package, see devtools installation instructions.

library(devtools)
devtools::install_github("ropensci/tidyqpcr", build_vignettes = TRUE)

## Alternatively, install without building the vignettes 
## (Not recommended as vignettes contain the tutorials on using tidyqpcr)
devtools::install_github("ropensci/tidyqpcr")

Note older versions of the remotes package automatically convert warnings to errors during installation. Please update your remotes package to >2.3.0 in order to remove this default.

Then load tidyqpcr as a standard package:

library(tidyqpcr)

Note tidyqpcr automatically imports and loads several external packages for basic functionality, including; tidy, dplyr and ggplot2. This allows tidyqpcr to be used immediately but may cause NAMESPACE clashes if the user already has many other package libraries loaded. Restarting the R session and loading tidyqpcr separately may solve such issues.

Using tidyqpcr

The best place to start is by viewing the articles on the tidyqpcr website. Here you will find the vignettes, which offer tutorials and example data analyses including figures. Currently there are 4 vignettes:

  • IntroDesignPlatesetup - Introduction to designing an experiment and setting up a plate plan in tidyqpcr.
  • DeltaCq96wellExample - Example analysis of 96-well RT-qPCR data including relative quantification with delta Cq, from a real experiment.
  • MultifactorialExample - Example design and analysis of a (real) multifactorial RT-qPCR experiment.
  • PrimerCalibration - Example design and analysis of calibrating qPCR primer sets from a (real) experimental test

To find these from your R session, enter browseVignettes(package="tidyqpcr").

Individual R functions are also documented, use R's standard help system after loading the package, e.g. ?create_blank_plate. To see a list of all the functions and links to their help pages use help(package="tidyqpcr").

A basic use case for designing a 12 well plate is given below, see IntroDesignPlatesetup for more details.

rowkey4 <- tibble(
  well_row = LETTERS[1:4],
  target_id = c("ACT1", "BFG2", "CDC19", "DED1")
)


colkey3 <- tibble(
  well_col = 1:3,
  sample_id = c("rep1", "rep2", "rep3"),
  prep_type = "+RT"
)

create_blank_plate(well_row = LETTERS[1:4], well_col = 1:3)

plate_plan12 <- label_plate_rowcol(
  plate = create_blank_plate(well_row = LETTERS[1:4], well_col = 1:3),
  rowkey = rowkey4,
  colkey = colkey3
)

display_plate_qpcr(plate_plan12)

Status

As of June 2022, this software is fully useable, and under active development. It is particularly good at designing qPCR experiments in microwell plates (96-well and 384-well), and at relative quantification by the delta Cq method.

Edward Wallace wrote basic functions and documentation needed to do qPCR analysis in the Wallace lab, then started building them into an R package. Sam Haynes is actively developing, initially as part of the eLife Open Innovation Leaders programme 2020.

If there is a feature that you need for your work, please ask us!

News - see NEWS.md.

Features

tidyqpcr can be used to analyse qPCR data from any nucleic acid source - DNA for qPCR or ChIP-qPCR, RNA for RT-qPCR.

Currently tidyqpcr has functions that support relative quantification by the delta Cq method, but not yet absolute quantification.

Current features

  • every object is a tibble / data frame, no special data classes to learn
  • lay out and display 96/384-well plates for easy experimental setup (label_plate_rowcol, create_blank_plate, ...).
  • consistently describe samples and target amplicons with reserved variable names (sample_id, target_id).
  • flexibly assign metadata to samples for visualisation with ggplot2 (see vignettes).
  • read in quantification cycle (Cq) and raw data from Roche LightCycler machines with single-channel fluorescence (read_lightcycler_1colour_cq, read_lightcycler_1colour_raw).
  • calibration of primer sets including estimating efficiencies and visualization of curves (calculate_efficiency, and see vignettes)
  • visualization of amplification and melt curves (calculate_drdt_plate, and see vignettes)
  • delta Cq: normalization/ relative quantification of Cq data to one or more reference targets by delta count method (calculate_normcq, calculate_deltacq_bysampleid)
  • delta delta Cq: normalization of delta Cq data across multiple samples (calculate_deltadeltacq_bytargetid)

Future priorities

  • including primer efficiencies in quantification
  • an open-source and tested Cq calculation function, from amplification curves
  • multi-colour (hydrolysis probe) detection
  • extend to 1536-well plates
  • metadata handling compatible with RDML format
  • files for automatic plate loading with Opentrons and Labcyte Echo liquid handlers.

Comparison of qPCR R packages with respect to the MIQE guidelines

Table of package features corresponding to the essential information on qPCR validation and data analysis, that are outlined by the MIQE guidelines for publication of qPCR results.

MIQE Guidelines tidyqpcr HTqPCR NormqPCR qpcR pcr
Version 0.5.0 1.48.0 1.40.0 1.4.1 1.2.2
For SYBR Green I, Cq of the NTC Yes + Docs Yes + Docs Yes + Docs Yes Yes
Calibration curves with slope and y intercept Slope No No Yes + Docs Yes + Docs
PCR efficiency calculated from slope Yes + Doc No Yes + Doc Yes + Doc Yes
r2 of calibration curve Yes + Doc No No Yes Yes
Linear dynamic range ‡ No No No No No
Cq variation at LOD ‡ No No No No No
Evidence for LOD ‡ No No No No No
If multiplex, efficiency and LOD of each assay ‡ No No No No No
Method of Cq determination N/A N/A Sigmoidal model selection Sigmoidal model selection N/A
Outlier identification and disposition No Yes Yes Yes No
Results for NTCs Yes + Doc Yes + Docs Yes + Docs Yes Yes
Justification of number and choice of reference genes User defined (vignettes encourage 3) User defined (vignettes encourage 2) Automatic Selection (vignettes encourage 2) User defined One
Description of normalization method Relative Relative Relative Relative or absolute Relative
Number and stage (reverse transcription or qPCR) of technical replicates User defined (vignettes encourage 3) User defined (vignettes encourage 3) User defined (vignettes encourage 2) User defined User defined (vignettes encourage 6)
Repeatability No† Yes + Docs Yes + Docs Yes + Docs No
Statistical methods for results significance No† Yes + Docs No Yes + Docs Yes

Note:

  • Yes means the package includes the functionality to complete this analysis.
  • Yes + Docs means this step is explicitly shown in either the function documentation or a vignette.
  • No† means that the package lacks explicit functionality, but generic R capabilities for statistical testing can be applied to the data.
  • ‡ Linear dynamic range and limit of detection (LOD) calculations would be enabled by these packages from additional short scripted analyses from a well-designed experiment, but the functionality is not specifically documented.

Contribute

We would be delighted to work with you to answer questions, add features, and fix problems. Please file an issue or email Edward dot Wallace at his University email address, (ed.ac.uk).

Code of conduct

This package is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.

How to contribute code: style, checking, development cycle

If you want to fix bugs or add features yourself, that's great. tidyqpcr development aims to follow best practices which we have outlined in the CONTRIBUTING.md file in the .github folder.

Thank you

Many thanks to everyone who has helped with tidyqpcr

Users and interviewees: Jamie Auxillos, Rosey Bayne, Liz Hughes, Rachael Murray, Elliott Chapman, Laura Tuck, Amy Newell, David Barrass, Christopher Katanski, Magnus Gwynne and Stuart McKeller. Reviewers: @seaaan, @kelshmo and @jooolia

tidyqpcr's People

Contributors

dimmestp avatar ewallace avatar maelle avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

tidyqpcr's Issues

Write RDML-like meta data file

Interviewee's often search published qPCR data sets for information on what probe sets, primer sequences, qpcr machines and prep kits to use. Perhaps adopting a file format for this data (with explanatory vignette) could simplify the process of reproducing results. RDML attempts to wrap all meta data with cq results in one large file which may be difficult for users to read? Could it also hold links to protocol.io for more explicit assay details?

Document use of multiple genes for normalisation

tidyqpcr already supports using multiple genes for normalisation in the function normaliseqPCR, by supplying a character vector of multiple TargetIDs. However, users don't seem to know this. We need to highlight this in the README.md and in function documentation and vignettes.

tidyqpcr logo?

Create a logo for tidyqpcr? Perhaps in tidyverse-inspired hex format?

Tibbles all the way - document

README and paper #44 should highlight the approach that everything is a tibble / data frame so that users only have to learn one standard kind of object. This contrasts with earlier qPCR R packages that use S4 classes and have many different kinds of objects.

normaliseqPCR, normalizeqPCR

Make an alias function so can call either normaliseqPCR, or normalizeqPCR, similar to summarise/summarize in dplyr.

SampleID not Sample

Change tidyqpcr default column to SampleID, from Sample, to clarify that this is a unique identifier of a nucleic acid sample.

This fix could be wrapped in with #39, changing to TargetID from Probe, again to clarify that this is a unique identifier of a primer set or primer set / probe combination.

Maybe discuss with a couple of other users before changing.

Write basic test suite

Tidyqpcr needs to have a test suite to be submitted to rOpenSci. This needs to be implemented with testthat.

Key unit tests are the interesting/workhorse functions that calculate:

  • calculate_normvalue
  • calculate_deltacq_bysampleid
  • calculate_deltadeltacq_bytargetid
  • calculate_efficiency
  • calculate_efficiency_bytargetid

Maybe also the creation and labeling functions?

  • create_blank_plate
    *label_plate_rowcol

Later can think about the other functions for curve data:

  • debaseline
  • calculate_dydx_1
  • calculate_drdt_plate

(edited to reflect updated names from #62)

Fix vignette names

Package checks with devtools is giving some warnings with inconsistent vignette names in different places.

Also browseVignettes("tidyqpcr") is not giving any results. Despite vignettes existing.

We should:

  • fix these by giving vignettes coherent names
  • check that all cross-references between vignettes and help/README files are in place and accurate.

R CMD check no visible binding

After some work, we still have some "no visible binding" warnings when running devtools::check() / R CMD check.

As of commit ee6d192, the remaining complaints are:

   calculate_deltacq_bysampleid: no visible binding for global variable
     ‘sample_id’
   calculate_deltacq_bysampleid: no visible binding for global variable
     ‘.’
   calculate_deltacq_bysampleid: no visible binding for global variable
     ‘.value’
   calculate_deltacq_bysampleid: no visible binding for global variable
     ‘value_to_norm_by’
   calculate_deltacq_bysampleid: no visible binding for global variable
     ‘value_norm’
   calculate_efficiency_bytargetid: no visible binding for global variable
     ‘.’
   calculate_normcq: no visible binding for global variable ‘.’
   create_blank_plate: no visible binding for global variable ‘well’
   display_plate: no visible global function definition for ‘aes’
   Undefined global functions or variables:
     . .value aes sample_id value_norm value_to_norm_by well

It would be good to fix those.

In some cases, the variable is defined in a tibble in function call before it is used (e.g. value_norm defined by dplyr::mutate), but R CMD check is still unhappy.

Manage namespace with roxygen2

Edit to manage the NAMESPACE (which functions are imported/exported etc) automatically with roxygen2. See guide in hadley's book.

Currently we use roxygen2 for documentation, but do the NAMESPACE by hand, and there are some problems with Imports/Depends (see #21). This should be fixed and made more maintainable by also automatically managing the NAMESPACE.

Calculate primer efficiency

We need a function to estimate the efficiency of primer amplification.

Currently this is done informally in calibration_vignette.Rmd, by matching the slopes of loglinear standard curves to the expected log2. It would be better to have a function
estimate_efficiency <- function(Dilution,Ct)
that applies a (log)-linear model to estimate the slope and converts to an efficiency value in %.

As the MIQE paper says:

PCR efficiency = 10^{−1/slope} − 1, when the logarithm of the initial template concentration (the independent variable) is plotted on the x axis and Cq (the dependent variable) is plotted on the y axis.

Informal description here:
https://toptipbio.com/calculate-primer-efficiencies/

Pipeline operator not working

After loading tidyqpcr, the pipeline operator is no longer found. If I try to load dplyr afterwards to get it back, I receive the following error:
Error in value[3L] : Package ‘dplyr’ version 0.7.6 cannot be unloaded: Error in unloadNamespace(package) : namespace ‘dplyr’ is imported by ‘tidyqpcr’ so cannot be unloaded.

normalizeqPCR mean vs median?

normalizeqPCR currently uses median Ct of reference gene(s). Can we make it an option to use mean rather than median?

Also document in terms of delta delta Ct method.

Relates to #17

short advertising email

Write a short email that can be forwarded by eLife open innovation colleagues and others, inviting people to use/test/contribute to tidyqpcr.

Intro needs to be 3 sentences.
Perhaps we can include more details after that.

Should we call the target-related column "Probe" or something else?

Is it confusing that we call the measurement variable "Probe", when it could equally refer to a Primer Set (for SYBR dye-style) or a fluorescent-quenched probe (for Taqman-style)? We cover this in documentation, but worry that some users might be confused, or choose not to use tidyqpcr as a result.

Ideas:

  • Target
  • Primer
  • Probe (no change)

Question from @j-aux

User Interviews

tidyqpcr is intended to be
a) a user friendly and flexible tool for analysing qPCR data and
b) an educational tool for users to learn how to conduct MIQE-compliant qPCR experiments and also
c) a friendly way to learn the basic building blocks of tidy data analysis.

We are actively engaging with users to gain feedback on documentation and usability. If you are looking to help improve tidyqcr for everyone, or just interested to learn more, please volunteer to be interviewed. Add your name as a comment below, and we will be in touch!

Swap data.frame to tibble for consistancy

In the calibration vignette the rowkeys object is defined as a dataframe not a tibble.

rowkey <- data.frame

Probably should replace this with tibble to avoid confusion!

Display printable plate schematic for easy plate loading

Create a function that outputs out a modified plate map clearly stating which target probe to place in which row (i.e. target_id as row name) and which columns have the same sample (sample_id as column name). This can be physically printed out to minimise plate loading mistakes.

Implement geNorm reference gene selection method

Check the MIQE-recommended GeNorm method, and compare in detail to tidyqpcr's normalizeqPCR function, which is geometric (Ct/log-scale) and uses median.

Method is described in Vandesompele et al., Genome Biology, 2002, 'Accurate normalization of real-time quantitative RT-PCR data by geometric averaging of multiple internal control genes'.

According to the geNorm website, this method is implemented in commercial software qbase+.

Fixing this will likely require adding an "efficiency" argument to normalizeqPCR.

Developer guide

We need a short developer guide including:

  • welcoming language
  • how to contribute
  • procedure for forking/branching/pull requests
  • R package requirements
  • anything relevant for roxygen2 documentation
  • code style to follow

Officially decide: tidyqpcr, tidyqPCR, TidyqPCR, ...

We should officially decide what to call tidyqpcr in print. The R package name is already lower-case, which is fine and avoids issues with typing things wrong. But in print (e.g. in the paper #44) we could reasonably call it tidyqPCR as PCR is generally capitalised. It would be nice to be consistent.

Check sign on delta delta Cq

Check conventions on which way round delta delta Cq goes.

As currently queried in deltacq_96well_vignette.Rmd, section "Plot delta delta Cq (log2-fold change) for each target gene":

NOTE: is this meant to be upside-down here? Or need we reverse the sign on delta delta Cq??

Windows installation instructions

There seem to be repeated problems with windows users installing tidyqpcr. It's not quite clear why. Problems probably lie upstream with rtools and devtools, see devtools installation instructions.

We should fix or at a minimum write better installation instructions, because this is a big barrier to users.

Difficulty with plate creation

Goal was to create a 384 well plate using the label_plate_rowcol(create_blank_plate(),rowkey,colkey) function but using my own manually defined colkey.
Documentation in help for label_plate_rowcol() states there may be a problem if "WellC is a character instead of a factor or integer".
I received the following error: Error: Can't join on 'WellC' x 'WellC' because of incompatible types (integer / factor)

Problem was solved when I manually made WellC factors. Documentation should be updated that integer WellC values cause issues.

Plate functions for split-loading with standard multichannel pipettes

So far the create_plate helper functions assume that plates are in 8x8 (or 6x8, 4x4) tight blocks. This is fine for 96-well plates with standard multichannel pipettes, or for 384-well plates with variable width pipettes. However loading 384-well plates from a 96-well plate or strip with fixed-width multichannel pipettes results in loading every 2nd well with one pipette run. This could result in adjacent wells being "paired" if we move the multichannel 1 across for a duplicate. Or adjacent wells being unrelated if two entirely different approaches are taken.

First step is to ask for some example plate layouts from real users, then figure out what is needed.

Related to #20 and #2.

Support for Taqman / hydrolysis / multi-colour probes

Current edition of tidyqpcr works for SYBR safe experiments, i.e. 1 probe in 1 colour per well. The other major approach to qPCR is hydrolysis probes (TaqMan), which has multiple probes measured in different wavelengths per well. tidyqpcr should cope with this fine, but the plate plans & display_plate will need adapting. We may need a new function to read multicolour data.

Help wanted! Good first issue for someone with Taqman data, especially from a Roche Lightcycler.

Generate "pick list" for loading a qPCR plate automatically

To load ingredients to a qPCR plate automatically, we need to specify reagents and amounts in a source plate to be loaded in the destination plate. This is called a pick list. To enable this, we need appropriate functions and a vignette in tidyqpcr. @j-aux is planning some experiments for this soon, so we can work with her to implement.

This issue is related to, but distinct from, #5. Pick lists would be useful even for loading smaller (e.g. 384-well) plates.

Create new tidyqpcr vignette with MIQE compliant raw data

The current delta-cq vignette shows how different forms of qPCR data can be incorporated and analysed by tidyqpcr but is not a good example of plate design according to the tidyqpcr ethos. A new vignette going from raw qpcr machine data to publishable results with MIQE compliant, tidy plate design would be a perfect stepping stone for new users.

delta delta Cq for between-sample relative quantification

Currently tidyqpcr calculates delta Cq for targets against reference set. We need to calculate delta delta Cq for the change in delta Cq between samples or conditions.

Needs a new calculate_ddcq function, or similar.

@ewallace to implement using recent reporter-gene qPCR data from Jamie Auxillos as test dataset.

Vignette explaining different kinds of graphs?

Some of our users may want to be able to make bar-and-stem graphs of qPCR data. We should have a vignette explaining how to do that, and various alternatives such as dot plots, how to use shape/colour/dodge/etc to make distinctions clearer. All concisely within the framework of a sample qPCR experiment, referring to other resources for more general solutions.

This would be most useful within the framework of a published PCR experiment. Could we ask e.g. David Barrass for data corresponding to a published dataset?

Suggested other resources:

Guide for setting up plates

Complementing the real-data vignettes, add a .Rmd tutorial describing how to design plate layouts.

The rule of thumb is to have a column describing everything you might need to know about a well contents during analysis (biological replicate, technical replicate, strain, treatment, etc). Can either make this through constant-identifiers, e.g. Sample column with entries like WT_hot_A and then use separate. Or, can start with the components Strain, Treatment, BioRep, then make Sample using unite.

Explicitly refer to the MIQE guidelines in this.

Calculate Ct/Cq from amplification curves

We want an open-source and tested algorithm to calculate Ct/Cq from raw amplification curves.

A threshhold method is probably best, see T Nolan, J Huggett, E Sanchez, Good practice guide for the application of quantitative PCR (qPCR), LGC (2013).

The underlying principle of the threshold method is that information related to the target quantity
is available in the log-linear phase of the amplification curve. By simply detecting the cycle where
the log-linear phase of the amplification curve crosses an arbitrary threshold level, information
about relative target quantities in different samples is obtained.

It is recommended to set the threshold as follows:

  • Sufficiently above the background fluorescence baseline to be confident of avoiding having
    any amplification curve cross the threshold prematurely due to background fluorescence, and
  • As low as possible to ensure that the threshold crosses at the log-linear phase of the
    amplification curve where it is unaffected by the plateau phase.

See also chipPCR paper, who have an implementation in R based on S4 classes. As they say, "Pre-processing in most commercial cyclers is a black box, which restrains reproducible research".

Explain grouping and summarizing in vignette?

Vignettes currently give examples of taking median or mean of technical replicates, but don't really explain it. Since this is a core capability of dplyr, using group_by and summarise, we don't need a separate function or help section. But we do need to tell users how it works and point them to generic dplyr/tidyverse help.

normaliseqPCR across experimental replicates

Currently, the normaliseqPCR function only groups by Sample. Therefore, if you are trying to normalise the same construct to the same control but for two or more experimental replicates the function doesn't work as expected. The function will group all the control's Ct values and calculate a cross-experiment median to normalise all construct's Ct. Instead, if provided with a another variable, s.a. "exp_rep", the function should normalise the constructs by the median of their respective experimental controls.

Thank collaborators

Add thanks to collaborators in README.md.

  • @seaaan and Stuart McKellar for help with 96-well vignette
  • @j-aux, @RoseyBayne, Liz Hughes, Stuart McKellar, David Barrass for user interviews.

Anyone else?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.