Code Monkey home page Code Monkey logo

astrorapid's Introduction

astrorapid

Real-time Automated Photometric IDentification (RAPID) of astronomical transients using deep learning

For full documentation, please go to https://astrorapid.readthedocs.io

Installation

pip install astrorapid

Example Usage

from astrorapid.classify import Classify

mjd = [57433.4816, 57436.4815, 57439.4817, 57451.4604, 57454.4397, 57459.3963, 57462.418 , 57465.4385, 57468.3768, 57473.3606, 57487.3364, 57490.3341, 57493.3154, 57496.3352, 57505.3144, 57513.2542, 57532.2717, 57536.2531, 57543.2545, 57546.2703, 57551.2115, 57555.2669, 57558.2769, 57561.1899, 57573.2133,57433.5019, 57436.4609, 57439.4587, 57444.4357, 57459.4189, 57468.3142, 57476.355 , 57479.3568, 57487.3586, 57490.3562, 57493.3352, 57496.2949, 57505.3557, 57509.2932, 57513.2934, 57518.2735, 57521.2739, 57536.2321, 57539.2115, 57543.2301, 57551.1701, 57555.2107, 57558.191 , 57573.1923, 57576.1749, 57586.1854]
flux = [2.0357230e+00, -2.0382695e+00,  1.0084588e+02,  5.5482742e+01,  1.4867026e+01, -6.5136810e+01,  1.6740545e+01, -5.7269131e+01,  1.0649184e+02,  1.5505235e+02,  3.2445984e+02,  2.8735449e+02,  2.0898877e+02,  2.8958893e+02,  1.9793906e+02, -1.3370536e+01, -3.9001358e+01,  7.4040916e+01, -1.7343750e+00,  2.7844931e+01,  6.0861992e+01,  4.2057487e+01,  7.1565346e+01, -2.6085690e-01, -6.8435440e+01, 17.573107  ,   41.445435  , -110.72664   ,  111.328964  ,  -63.48336   ,  352.44907   ,  199.59058   ,  429.83075   ,  338.5255    ,  409.94604   ,  389.71262   ,  195.63905   ,  267.13318   ,  123.92461   ,  200.3431    ,  106.994514  ,  142.96387   ,   56.491238  ,   55.17521   ,   97.556946  ,  -29.263103  ,  142.57687   ,  -20.85057   ,   -0.67210346,   63.353024  ,  -40.02601]
fluxerr = [42.784702,  43.83665 ,  99.98704 ,  45.26248 ,  43.040398,  44.00679 ,  41.856007,  49.354336, 105.86439 , 114.0044  ,  45.697918,  44.15781 ,  60.574158,  93.08788 ,  66.04482 ,  44.26264 ,  91.525085,  42.768955,  43.228336,  44.178196,  62.15593 , 109.270035, 174.49638 ,  72.6023  ,  48.021034, 44.86118 ,  48.659588, 100.97703 , 148.94061 ,  44.98218 , 139.11194 ,  71.4585  ,  47.766987,  45.77923 ,  45.610615,  60.50458 , 105.11658 ,  71.41217 ,  43.945534,  45.154167,  43.84058 ,  52.93122 ,  44.722775,  44.250145,  43.95989 ,  68.101326, 127.122025, 124.1893  ,  49.952255,  54.50728 , 114.91599]
passband = ['g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r']
photflag = [0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 4096, 4096,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 0,    0,    0,    0,    0,    0,    0,    0,    0, 4096, 6144, 4096, 4096, 4096, 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 0,    0,    0,    0]
objid = 'transient_1'
ra = 3.75464531293933
dec = 0.205076187109334
redshift = 0.233557
mwebv = 0.0228761

light_curve_list = [(mjd, flux, fluxerr, passband, photflag, ra, dec, objid, redshift, mwebv)]

classification = Classify()
predictions, time_steps = classification.get_predictions(light_curve_list)
print(predictions)

classification.plot_light_curves_and_classifications()
classification.plot_classification_animation()
    

astrorapid's People

Contributors

daniel-muthukrishna avatar deepchatterjeeligo avatar nmiranda avatar

Stargazers

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

Watchers

 avatar  avatar  avatar  avatar  avatar

astrorapid's Issues

Astrorapid examples not running

Hi,

I am trying to run astrorapid and and getting a TypeError: while_loop() got an unexpected keyword argument 'maximum_iterations', when try to run the examples (either the one here or the one on read the docs). I've attached the error trace below.

Any help in fixing this would be greatly appreciated.

Many thanks,

Raphael.


TypeError Traceback (most recent call last)
in ()
15 light_curve_list = [(mjd, flux, fluxerr, passband, zeropoint, photflag, ra, dec, objid, redshift, mwebv)]
16
---> 17 classification = Classify()
18 predictions, time_steps = classification.get_predictions(light_curve_list)
19 print(predictions)

~/anaconda/envs/herschelhelp_internal/lib/python3.6/site-packages/astrorapid/classify.py in init(self, known_redshift, model_filepath, passbands, bcut, zcut, graph, model)
90 self.model = model
91 else:
---> 92 self.model = load_model(self.model_filepath)
93
94 def process_light_curves(self, light_curves):

~/anaconda/envs/herschelhelp_internal/lib/python3.6/site-packages/keras/engine/saving.py in load_model(filepath, custom_objects, compile)
417 f = h5dict(filepath, 'r')
418 try:
--> 419 model = _deserialize_model(f, custom_objects, compile)
420 finally:
421 if opened_new_file:

~/anaconda/envs/herschelhelp_internal/lib/python3.6/site-packages/keras/engine/saving.py in _deserialize_model(f, custom_objects, compile)
223 raise ValueError('No model found in config.')
224 model_config = json.loads(model_config.decode('utf-8'))
--> 225 model = model_from_config(model_config, custom_objects=custom_objects)
226 model_weights_group = f['model_weights']
227

~/anaconda/envs/herschelhelp_internal/lib/python3.6/site-packages/keras/engine/saving.py in model_from_config(config, custom_objects)
456 'Sequential.from_config(config)?')
457 from ..layers import deserialize
--> 458 return deserialize(config, custom_objects=custom_objects)
459
460

~/anaconda/envs/herschelhelp_internal/lib/python3.6/site-packages/keras/layers/init.py in deserialize(config, custom_objects)
53 module_objects=globs,
54 custom_objects=custom_objects,
---> 55 printable_module_name='layer')

~/anaconda/envs/herschelhelp_internal/lib/python3.6/site-packages/keras/utils/generic_utils.py in deserialize_keras_object(identifier, module_objects, custom_objects, printable_module_name)
143 config['config'],
144 custom_objects=dict(list(_GLOBAL_CUSTOM_OBJECTS.items()) +
--> 145 list(custom_objects.items())))
146 with CustomObjectScope(custom_objects):
147 return cls.from_config(config['config'])

~/anaconda/envs/herschelhelp_internal/lib/python3.6/site-packages/keras/engine/sequential.py in from_config(cls, config, custom_objects)
301 model.add(layer)
302 if not model.inputs and build_input_shape:
--> 303 model.build(build_input_shape)
304 return model

~/anaconda/envs/herschelhelp_internal/lib/python3.6/site-packages/keras/engine/sequential.py in build(self, input_shape)
219 self.inputs = [x]
220 for layer in self._layers:
--> 221 x = layer(x)
222 self.outputs = [x]
223 self._build_input_shape = input_shape

~/anaconda/envs/herschelhelp_internal/lib/python3.6/site-packages/keras/layers/recurrent.py in call(self, inputs, initial_state, constants, **kwargs)
530
531 if initial_state is None and constants is None:
--> 532 return super(RNN, self).call(inputs, **kwargs)
533
534 # If any of initial_state or constants are specified and are Keras

~/anaconda/envs/herschelhelp_internal/lib/python3.6/site-packages/keras/engine/base_layer.py in call(self, inputs, **kwargs)
455 # Actually call the layer,
456 # collecting output(s), mask(s), and shape(s).
--> 457 output = self.call(inputs, **kwargs)
458 output_mask = self.compute_mask(inputs, previous_mask)
459

~/anaconda/envs/herschelhelp_internal/lib/python3.6/site-packages/keras/layers/recurrent.py in call(self, inputs, mask, training, initial_state)
1647 mask=mask,
1648 training=training,
-> 1649 initial_state=initial_state)
1650
1651 @Property

~/anaconda/envs/herschelhelp_internal/lib/python3.6/site-packages/keras/layers/recurrent.py in call(self, inputs, mask, training, initial_state, constants)
647 mask=mask,
648 unroll=self.unroll,
--> 649 input_length=timesteps)
650 if self.stateful:
651 updates = []

~/anaconda/envs/herschelhelp_internal/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py in rnn(step_function, inputs, initial_states, go_backwards, mask, constants, unroll, input_length)
3009 parallel_iterations=32,
3010 swap_memory=True,
-> 3011 maximum_iterations=input_length)
3012 last_time = final_outputs[0]
3013 output_ta = final_outputs[1]

TypeError: while_loop() got an unexpected keyword argument 'maximum_iterations'

Missing transient class in predictions

There seems to be a missing transient class in the plotting of the lightcurve model. In the example attached, the predictions for the transient classes visible for ZTF20aadtar all drop to zero probability after 60 days on the plots, so the sum of the probabilities does not sum up to one. However, looking in the get_predictions (which have been outputted to excel sheet) I can see a column, dubbed 'XXXXX', that makes up the missing prediction values. What transient class does this mysterious column refer to?

classification_vs_time_ZTF20aadtarr_non_dets_exc_step_no_interp.pdf

ZTF20aadtarr_non_dets_exc_predict_vals.xlsx

python 3.9 failed to pip install due to extinction

On python 3.9 (3.9.5) during pip install astrorapid

I get the following output. extinction==0.4 will not install but the latest extinction does. Do we have to pin to this older version?

      In file included from /usr/local/lib/python3.9/dist-packages/numpy/core/include/numpy/ndarraytypes.h:1944,
                       from /usr/local/lib/python3.9/dist-packages/numpy/core/include/numpy/ndarrayobject.h:12,
                       from /usr/local/lib/python3.9/dist-packages/numpy/core/include/numpy/arrayobject.h:4,
                       from extinction.c:636:
      /usr/local/lib/python3.9/dist-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using deprecated NumPy API, disable it with " "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp]
         17 | #warning "Using deprecated NumPy API, disable it with " \
            |  ^~~~~~~
      extinction.c: In function ‘__Pyx_modinit_type_init_code’:
      extinction.c:24502:40: error: ‘PyTypeObject’ {aka ‘struct _typeobject’} has no member named ‘tp_print’
      24502 |   __pyx_type_10extinction_Fitzpatrick99.tp_print = 0;
            |                                        ^
      extinction.c:24512:25: error: ‘PyTypeObject’ {aka ‘struct _typeobject’} has no member named ‘tp_print’
      24512 |   __pyx_type___pyx_array.tp_print = 0;
            |                         ^
      extinction.c:24517:31: error: ‘PyTypeObject’ {aka ‘struct _typeobject’} has no member named ‘tp_print’
      24517 |   __pyx_type___pyx_MemviewEnum.tp_print = 0;
            |                               ^
      extinction.c:24532:30: error: ‘PyTypeObject’ {aka ‘struct _typeobject’} has no member named ‘tp_print’
      24532 |   __pyx_type___pyx_memoryview.tp_print = 0;
            |                              ^
      extinction.c:24545:35: error: ‘PyTypeObject’ {aka ‘struct _typeobject’} has no member named ‘tp_print’
      24545 |   __pyx_type___pyx_memoryviewslice.tp_print = 0;
            |                                   ^
      extinction.c: In function ‘__Pyx_ParseOptionalKeywords’:
      extinction.c:25844:21: warning: ‘_PyUnicode_get_wstr_length’ is deprecated [-Wdeprecated-declarations]
      25844 |                     (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
            |                     ^
      In file included from /usr/include/python3.9/unicodeobject.h:1026,
                       from /usr/include/python3.9/Python.h:97,
                       from extinction.c:30:
      /usr/include/python3.9/cpython/unicodeobject.h:446:26: note: declared here
        446 | static inline Py_ssize_t _PyUnicode_get_wstr_length(PyObject *op) {
            |                          ^~~~~~~~~~~~~~~~~~~~~~~~~~
      extinction.c:25844:21: warning: ‘PyUnicode_AsUnicode’ is deprecated [-Wdeprecated-declarations]
      25844 |                     (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
            |                     ^
      In file included from /usr/include/python3.9/unicodeobject.h:1026,
                       from /usr/include/python3.9/Python.h:97,
                       from extinction.c:30:
      /usr/include/python3.9/cpython/unicodeobject.h:580:45: note: declared here
        580 | Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode(
            |                                             ^~~~~~~~~~~~~~~~~~~
      extinction.c:25844:21: warning: ‘_PyUnicode_get_wstr_length’ is deprecated [-Wdeprecated-declarations]
      25844 |                     (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
            |                     ^
      In file included from /usr/include/python3.9/unicodeobject.h:1026,
                       from /usr/include/python3.9/Python.h:97,
                       from extinction.c:30:
      /usr/include/python3.9/cpython/unicodeobject.h:446:26: note: declared here
        446 | static inline Py_ssize_t _PyUnicode_get_wstr_length(PyObject *op) {
            |                          ^~~~~~~~~~~~~~~~~~~~~~~~~~
      extinction.c:25844:21: warning: ‘_PyUnicode_get_wstr_length’ is deprecated [-Wdeprecated-declarations]
      25844 |                     (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
            |                     ^
      In file included from /usr/include/python3.9/unicodeobject.h:1026,
                       from /usr/include/python3.9/Python.h:97,
                       from extinction.c:30:
      /usr/include/python3.9/cpython/unicodeobject.h:446:26: note: declared here
        446 | static inline Py_ssize_t _PyUnicode_get_wstr_length(PyObject *op) {
            |                          ^~~~~~~~~~~~~~~~~~~~~~~~~~
      extinction.c:25844:21: warning: ‘PyUnicode_AsUnicode’ is deprecated [-Wdeprecated-declarations]
      25844 |                     (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
            |                     ^
      In file included from /usr/include/python3.9/unicodeobject.h:1026,
                       from /usr/include/python3.9/Python.h:97,
                       from extinction.c:30:
      /usr/include/python3.9/cpython/unicodeobject.h:580:45: note: declared here
        580 | Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode(
            |                                             ^~~~~~~~~~~~~~~~~~~
      extinction.c:25844:21: warning: ‘_PyUnicode_get_wstr_length’ is deprecated [-Wdeprecated-declarations]
      25844 |                     (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
            |                     ^
      In file included from /usr/include/python3.9/unicodeobject.h:1026,
                       from /usr/include/python3.9/Python.h:97,
                       from extinction.c:30:
      /usr/include/python3.9/cpython/unicodeobject.h:446:26: note: declared here
        446 | static inline Py_ssize_t _PyUnicode_get_wstr_length(PyObject *op) {
            |                          ^~~~~~~~~~~~~~~~~~~~~~~~~~
      extinction.c:25860:25: warning: ‘_PyUnicode_get_wstr_length’ is deprecated [-Wdeprecated-declarations]
      25860 |                         (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
            |                         ^
      In file included from /usr/include/python3.9/unicodeobject.h:1026,
                       from /usr/include/python3.9/Python.h:97,
                       from extinction.c:30:
      /usr/include/python3.9/cpython/unicodeobject.h:446:26: note: declared here
        446 | static inline Py_ssize_t _PyUnicode_get_wstr_length(PyObject *op) {
            |                          ^~~~~~~~~~~~~~~~~~~~~~~~~~
      extinction.c:25860:25: warning: ‘PyUnicode_AsUnicode’ is deprecated [-Wdeprecated-declarations]
      25860 |                         (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
            |                         ^
      In file included from /usr/include/python3.9/unicodeobject.h:1026,
                       from /usr/include/python3.9/Python.h:97,
                       from extinction.c:30:
      /usr/include/python3.9/cpython/unicodeobject.h:580:45: note: declared here
        580 | Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode(
            |                                             ^~~~~~~~~~~~~~~~~~~
      extinction.c:25860:25: warning: ‘_PyUnicode_get_wstr_length’ is deprecated [-Wdeprecated-declarations]
      25860 |                         (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
            |                         ^
      In file included from /usr/include/python3.9/unicodeobject.h:1026,
                       from /usr/include/python3.9/Python.h:97,
                       from extinction.c:30:
      /usr/include/python3.9/cpython/unicodeobject.h:446:26: note: declared here
        446 | static inline Py_ssize_t _PyUnicode_get_wstr_length(PyObject *op) {
            |                          ^~~~~~~~~~~~~~~~~~~~~~~~~~
      extinction.c:25860:25: warning: ‘_PyUnicode_get_wstr_length’ is deprecated [-Wdeprecated-declarations]
      25860 |                         (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
            |                         ^
      In file included from /usr/include/python3.9/unicodeobject.h:1026,
                       from /usr/include/python3.9/Python.h:97,
                       from extinction.c:30:
      /usr/include/python3.9/cpython/unicodeobject.h:446:26: note: declared here
        446 | static inline Py_ssize_t _PyUnicode_get_wstr_length(PyObject *op) {
            |                          ^~~~~~~~~~~~~~~~~~~~~~~~~~
      extinction.c:25860:25: warning: ‘PyUnicode_AsUnicode’ is deprecated [-Wdeprecated-declarations]
      25860 |                         (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
            |                         ^
      In file included from /usr/include/python3.9/unicodeobject.h:1026,
                       from /usr/include/python3.9/Python.h:97,
                       from extinction.c:30:
      /usr/include/python3.9/cpython/unicodeobject.h:580:45: note: declared here
        580 | Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode(
            |                                             ^~~~~~~~~~~~~~~~~~~
      extinction.c:25860:25: warning: ‘_PyUnicode_get_wstr_length’ is deprecated [-Wdeprecated-declarations]
      25860 |                         (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
            |                         ^
      In file included from /usr/include/python3.9/unicodeobject.h:1026,
                       from /usr/include/python3.9/Python.h:97,
                       from extinction.c:30:
      /usr/include/python3.9/cpython/unicodeobject.h:446:26: note: declared here
        446 | static inline Py_ssize_t _PyUnicode_get_wstr_length(PyObject *op) {
            |                          ^~~~~~~~~~~~~~~~~~~~~~~~~~
      extinction.c: In function ‘__Pyx_decode_c_string’:
      extinction.c:26673:9: warning: ‘PyUnicode_FromUnicode’ is deprecated [-Wdeprecated-declarations]
      26673 |         return PyUnicode_FromUnicode(NULL, 0);
            |         ^~~~~~
      In file included from /usr/include/python3.9/unicodeobject.h:1026,
                       from /usr/include/python3.9/Python.h:97,
                       from extinction.c:30:
      /usr/include/python3.9/cpython/unicodeobject.h:551:42: note: declared here
        551 | Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode(
            |                                          ^~~~~~~~~~~~~~~~~~~~~
      error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  WARNING: No metadata found in /usr/local/lib/python3.9/dist-packages
  Rolling back uninstall of extinction
  Moving to /usr/local/lib/python3.9/dist-packages/extinction-0.4.6.dist-info/
   from /usr/local/lib/python3.9/dist-packages/~xtinction-0.4.6.dist-info
  Moving to /usr/local/lib/python3.9/dist-packages/extinction.cpython-39-x86_64-linux-gnu.so
   from /tmp/pip-uninstall-2h1rut6d/extinction.cpython-39-x86_64-linux-gnu.so
error: legacy-install-failure

× Encountered error while trying to install package.
╰─> extinction

note: This is an issue with the package mentioned above, not pip.
hint: See above for output from the failure.
WARNING: There was an error checking the latest version of pip.

Installation instructions incomplete

I ran into several issues when installing astrorapid from source, none of which were accounted for in the installation instructions.

There was a dependency that I needed to install (just for package import) that was not included in the documentation, namely keras-tcn.

I was also getting version matching errors (from setup.py of astrorapid, but not from conda when building the environment) between numpy and tensorflow. I'm not sure what's happening there but I won't investigate further since I got it to work for myself.

I suggest adding a requirements.txt. Since I use conda, the best I can offer is the following for environment.yml:

name: rapid
channels:
  - conda-forge
  - defaults
dependencies:
  - python==3.7
  - numpy==1.19
  - tensorflow
  - keras
  - astropy
  - pandas
  - extinction
  - scikit-learn
  - matplotlib
  - scipy
  - pip:
    - keras-tcn==3.3.1

Plotting key error

After running the get_predictions method, which seems to have executed successfully, I attempt to plot the predictions with the plot_light_curves_and_classifications method. In doing so I get KeyError: 'g' originating on line 266 of classify.py; new_t = np.array([self.orig_lc[idx][pb]['time'].values for pb in self.passbands]).flatten()

Basic running of code

Hi,

I have a couple of basic questions that I can't find answered in the documentation.

As far as I can tell a photflag of 6144 means that photometry value is for the first detection. Does the code therefore presume previous values are upper flux limits from non detections?

Does the photflag 4096 mean a non detection upper limit?

I'm interpreting relative flux as (flux - min_flux)/(max_flux - min_flux). Is that correct? The graphs from my objects have a relative flux above 1 (e.g. 200) is that an error due to me feeding fluxes (in micro Jansky) in the wrong format?

Many thanks and sorry if these questions are answered somewhere else I can't find.

Best regards,

Raphael.

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.