A platform for creating interactive data visualizations

Overview

owid-grapher

Actions Status Test coverage Storybook

This is the project we use at Our World in Data to create embeddable visualizations like this one (click for interactive):

Life expectancy at birth


⚠️ This project is currently not well designed for immediate reuse as a visualization library, or for reproducing the full production environment we have at Our World in Data.

The Grapher relies heavily on the current database structure, and there are some hard-to-reproduce dependencies in order to create a full production environment that supports publishing embeddable charts.

We're gradually making steps towards making our work more reusable, however we still prioritize needs specific to our project that can be at odds with making our tools reusable.

You are still very welcome to reuse and adapt any of our code for your own purposes, and we welcome contributions!


Overview of this repository

The Grapher is the client-side visualization library that displays data interactively (almost every interactive chart on Our World in Data uses this). It consumes a JSON file to configure it, and an additional JSON file that encodes the data. ⚠️ The Grapher is currently not well designed for immediate reuse as a standalone visualization library, it relies heavily on our database structure.

The Grapher Admin is both a server-side and client-side TypeScript project that:

  • provides a user interface for configuring interactive charts ("graphers"), managing and uploading data
  • manages the MySQL database that stores the data for all grapher instances.

Wordpress is used by authors to write the content published on Our World in Data. It is a relatively stock setup including a custom plugin to provide additional blocks for the Gutenberg editor. The Wordpress content and configuration is stored in a MySQL database, which currently isn't shared publicly.

The baker is used to build the full static Our World in Data website by merging the content authored in Wordpress with the graphers created in Grapher Admin.

Explorers are a relatively new addition. For readers, they provide a user interface around graphers. Under the hood, they use the Grapher as a visualization library. There is an admin to configure explorers. The config files end up in a git repo (not MySQL as most of the other content).

Initial development setup

To contribute to the Grapher you do not need to set up everything described in the previous section (e.g. you don't need to run Wordpress unless you want to test the integration and baking locally).

This section describes the steps necessary to run Grapher Admin locally, which allows you to create, modify and preview (but not publish) interactive charts in your local environment. For this you need a MySQL database and the admin server running.

Members of the Our World In Data team can get the full setup, including Wordpress, by using the Lando project setup in the wordpress folder which automates much of the setup.

Instructions for macOS

  1. Install Homebrew first, follow the instructions here: https://brew.sh/

  2. Install Homebrew services:

    brew tap homebrew/services
  3. Install MySQL 5.7:

    brew install [email protected]
  4. Start the MySQL service:

    brew services start [email protected]
  5. Install nvm:

    brew update
    brew install nvm
    source $(brew --prefix nvm)/nvm.sh
  6. Clone this project if you haven't already, and switch to the project directory

  7. Install Node:

    nvm install

    (this will pick up the right version from .nvmrc)

  8. Install yarn:

    npm install -g yarn
  9. Clone the "owid-content" folder as a sibling to the owid-grapher:

    git clone https://github.com/owid/owid-content
  10. Inside the repo folder, install all dependencies by running:

    yarn

Other platforms

You will need: MySQL 5.7, Node 12.20+ and Yarn. Running yarn in the repo root will grab the remaining dependencies.

Database setup

Remove the password

Remove the password for root by opening the MySQL shell with mysql and running:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';

We do this for convenience so we can run mysql commands without providing a password each time. You can also set a password, just make sure you include it in your .env file later.

Import the latest data extract

Daily exports from the live OWID database are published here and can be used for testing:

File Description Size (compressed)
owid_metadata.sql.gz Table structure and metadata, everything except data_values ~15 MB
owid_chartdata.sql.gz All data values used by published visualizations >200MB

This script will create a database, then download and import all OWID charts and their data (might take a while!):

./db/downloadAndCreateDatabase.sh

Note that the data_values table will be incomplete – it will only contain data used in charts. In production, this table is >20GB (uncompressed) and contains unreviewed and undocumented data, so we currently don't offer a full export of it.

Inspecting the database

On macOS, we recommend using Sequel Pro (it's free).

We also have a rough sketch of the schema as it was on November 2019 (there may be slight changes).

Development server

Set up your .env file by copying the example:

cp .env.example .env

Then run the three development processes:

yarn startTscServer
yarn startAdminServer
yarn startWebpackServer

Or alternatively, you can also start all 3 processes in one terminal window with tmux:

yarn startTmuxServer

Then head to localhost:3030/admin. If everything is going to plan, you should see a login screen! The default user account is [email protected] with a password of admin.

This development server will rebuild the site when changes are made, so you only need to reload the browser when making changes.

Architecture notes

Our implementation is based around reactive programming using React and Mobx, allowing it to do client-side data processing efficiently. New code should be written in TypeScript. Visual Studio Code is recommended for the autocompletion and other awesome editor analysis features enabled by static typing.

package.json style guide

We follow some conventions:

  1. camelCase the command names. This ensures that these command names are also valid identifiers and consistent with our TypeScript code.
  2. Use longer unique names like buildSiteCss instead of style. We have to rely on global string matches for finding uses in code, making them unique helps.
  3. Identify what "kind" of command your script is and choose an existing decorator, unless it's of a new kind. Think of the "build" and "start" prefixes as function decorators and choose an appropriate one. For example, if your script starts a long lived process, it should be named something like startXXXServer; if it generates output to disk, something like buildXXX.

Why did we start this project?

The following is an excerpt explaining the origin of this repo and what the alternatives tried were (source: Max Roser's Reddit AMA on Oct 17, 2017)

We built the Grapher because there is no similar external tool available. Datawrapper, Tableau, Plotly, various libraries based on d3 are out there but nothing is similar to what the Grapher does for our project.

Before we developed this tool, we built interactive web visualizations by hand through a difficult process of preparing individual spreadsheets of data and then writing custom HTML and JavaScript code to process the contents for each individual visualization. That was pretty painful and it took me hours sometimes to built a chart.

The owid-grapher solves this problem by using a single visualization codebase and crucially a single database into which all of our data is placed. Once the data has been imported, the process of creating a visualization is reduced to simply choosing what kind of visualization is needed and then selecting the relevant variables in the Grapher user interface. The result may then be customized, and is published to the web with the press of a button.

Using our own system has very important advantages:

  • Integration with our global development database: Our database of global development metrics is integrated into our visualization tool so that when we add and update empirical data the visualizations are all updated. (In contrast to this, a pre-existing tool would make the exploration of a database impossible and would require the preparation of each dataset separately for each visualisation.)

  • Flexibility: We can use automation to change our entire system all at once. For example, if we decide we want to use a different source referencing style, we could easily update this across hundreds of charts. This makes it possible to scale our publication and to sustainably improve our work without starting from scratch at each round.

  • Risk mitigation: We hope(!) that Our World in Data is a long-term project and we want the visualizations we produce to continue to be useful and available years from now. An external web service may be shut down or change for reasons we cannot control. We have had this experience in the past and learned our lesson from it.

  • Keeping everything up-to-date: Because we want to be a useful resource for some time we make sure that we have a technology in place that allows us to keep all of our work up-to-date without starting from scratch each time. We have our global development database directly integrated in the Grapher and as soon as new data becomes available (for example from a UN agency) we can run a script that pulls in that data and updates all the visualizations that present that data.


Cross-browser testing provided by BrowserStack

Client-side bug tracking provided by

Comments
  • Delete or archive old datasets that are not used in any chart

    Delete or archive old datasets that are not used in any chart

    Proposal

    We could enumerate, manually verify, then delete all datasets >6m old which are not used in any chart.

    Scope

    • [x] Enumerate datasets to delete (>6 month old never used non-bulk OR >3y old never used bulk)
    • [x] Manually verify
    • [x] ~~Delete in a migration~~ Archive in a migration
    • [x] Hide archived data from the chart builder admin

    Rationale

    We would like to move the "source of truth" of our data from MySQL to the ETL over time, which involves backporting old datasets for which we have no recipe from MySQL to the ETL, to be republished to the general public. We do not want to ship data to the public that we're not happy with, and we do not want to QA data that by definition wasn't important enough to use. So we should delete it instead.

    Related issues

    • https://github.com/owid/etl/issues/24
    • #1337
    data maintenance priority 2 - important 
    opened by larsyencken 29
  • Text spacing incorrect on charts on Android mobile

    Text spacing incorrect on charts on Android mobile

    On my Pixel 3, virtually all charts have text spacing issues when opened in the Google Search "browser" and Chrome Beta. Appears to happen on @MarcelGerber's phone as well. Screenshot_20200327-195856

    opened by shaahmad 21
  • Admin for managing Google Docs articles

    Admin for managing Google Docs articles

    (original description by @mlbrgl)

    As part of the migration from Wordpress to google docs (#1597), we're replacing the Wordpress block editor with Google docs.

    Beyond editing documents, Wordpress provides some non-editor features, such as publication workflows, media management, document management or category management.

    Wordpress block editor  ≡  Google docs
    Wordpress admin  ≡  ?
    

    This issue aims at filling some of this gap, starting with document management. Other candidate CMS features of the current set-up can be found in the CMS glossary, which will serve as a basis for migration decisions around CMS features.

    A possible approach has been developed in the https://github.com/owid/owid-show experiment and might be ported over to https://github.com/owid/owid-grapher. Some other approaches will be considered as well, in anticipation of the port of all remaining CMS features into this new foundation.

    Cycle 2022.5 (Aug 29 -> Sep 16)

    Wireframes, background work

    Cycle 2022.6 (Sep 26 -> Oct 14)

    Completed on branch, awaiting PR review

    • [x] gdocs refresh flow
    • [x] API routes
    • [x] content checks
    • [x] UI, dialogs
    • [x] wiring with Matt's work
    • [x] feedback rounds
    • [x] integration of additional metadata (e.g. authors, date)
    • [x] UX polishing, probably around document status and available actions
    • [x] preview in new tab?

    Merged and shipped

    Additional scope

    • [x] integration with feed (and newsletter). Done in #1762
    • [ ] integration with Algolia
    architecture explore priority 1 - essential 
    opened by larsyencken 15
  • Change delimiter in country query parameter to support Facebook URLs

    Change delimiter in country query parameter to support Facebook URLs

    This addresses https://github.com/owid/owid-grapher/issues/397

    It maintains backwards compatibility with the current URLs (called "v1"), while from here on out using a new schema ("v2"). v2 uses "|" as the delimiter, and concatenates the entities and then encodes the whole string. v2 always contain a "|", so if there is only 1 entity I append an extra "|" just to differentiate between v1 and v2.

    The downside is the URLs are not as pretty, so very open to suggestions. Another potential tweak is to only use v2 style URLs for the Facebook share button (but then we'd have the problem if someone just copies/pastes the url into FB). Or we could use a different delimiter that doesn't have the Facebook problems (~ or _ perhaps).

    opened by breck7 14
  • Port the country name standardizer to JavaScript

    Port the country name standardizer to JavaScript

    Aibek wrote this useful tool for standardizing country names between different formats, a common problem in working with economics datasets: https://github.com/owid/owid-grapher/tree/master/country_name_tool

    This is currently server-side code, but we'd like to do most of it client-side. It should be possible to preload the necessary entity data and process the CSV entirely in the browser.

    I think the only server-side step should be the remembering of choices in the case when manual resolution is needed.

    Once ported to client-side JS, we could then think about moving the standardizer out of the admin and making it a standalone public tool.

    help wanted 
    opened by ghost 13
  • Fix number formatting for numeric columns

    Fix number formatting for numeric columns

    Fixes:

    • https://www.notion.so/owid/Don-t-show-decimals-when-they-re-not-relevant-5a29552c6a09461fb7b18a45a73c965c
    • https://www.notion.so/owid/CFR-y-axis-values-are-off-1c13e1caefa244fcb19e15305d72c978
    1. All formatting methods now accept overrides. These are necessary I think because the formatting depends on the context the number is formatted for. E.g. in the country picker we want to use short number prefixes (M = million, B = billion), but not in the tooltip. Both are using formatValueShort, because formatValueLong uses a long unit. We could introduce something likeformatValueVeryShort for the country picker use case, but that seems a bit much.

    2. ~~I removed the Population, PopulationDensity and Age columns. I don't think they are used anywhere?~~

      ~~It probably doesn't make sense to go that granular? Age could be used in different contexts – age of the planet? of people? life expectancy? They all might need slightly different settings. I think the current numeric types + formatting config are enough.~~ Reverted. More comments below.

    opened by danielgavrilov 12
  • Timeline Tooltips + Upgrades

    Timeline Tooltips + Upgrades

    Live on Nightingale.

    ezgif-6-952d16debb7e

    This PR:

    • creates tooltips on the Timeline that show the currently selected date, and fade after 2 seconds.
    • adds padding around the Timeline to make it easier to click.
    • fixes a small Timeline bug where the Handle jumps on click.
    opened by shaahmad 11
  • On Facebook, sharing a link to a Grapher chart with a query string that has encoded spaces is broken

    On Facebook, sharing a link to a Grapher chart with a query string that has encoded spaces is broken

    A user reported that sharing certain links is broken by Facebook. I was able to repro.

    Facebook will add a "fbclid" param to the query string. That doesn't break things. The problem is they will also rewrite our query string params, turning "North%20America" into "North+America".

    This: https://ourworldindata.org/grapher/daily-cases-covid-19?country=Africa+Asia+Europe+North%20America+Oceania+South%20America+OWID_WRL

    Becomes this: https://ourworldindata.org/grapher/daily-cases-covid-19?country=Africa+Asia+Europe+North+America+Oceania+South+America+OWID_WRL&fbclid=some_long_random_id

    I couldn't find any documentation from FB on this. Not sure if a lot of people are hitting this and whether it's worth changing the way we do query strings which might be tricky.

    opened by breck7 11
  • Quota exceeded for docs.googleapis.com

    Quota exceeded for docs.googleapis.com

    Problem

    We're getting a surprising out-of-quota message from our /admin/api/gdocs/<hash> endpoint:

    Error: Quota exceeded for quota metric 'Quota group for read operations' and limit 'Quota group for read operations per minute per user' of service '[docs.googleapis.com](http://docs.googleapis.com/)' for consumer 'project_number:363269344442'.
        at Gaxios._request (/home/owid/live/node_modules/gaxios/build/src/gaxios.js:130:23)
        at processTicksAndRejections (node:internal/process/task_queues:96:5)
        at async JWT.requestAsync (/home/owid/live/node_modules/google-auth-library/build/src/auth/oauth2client.js:382:18)
        at async gdocToArchieML (/home/owid/live/itsJustJavascript/db/gdocToArchieml.js:17:22)
        at async Gdoc.updateWithDraft (/home/owid/live/itsJustJavascript/db/model/Gdoc.js:48:30)
        at async /home/owid/live/itsJustJavascript/adminSiteServer/apiRouter.js:1791:9
        at async /home/owid/live/itsJustJavascript/adminSiteServer/FunctionalRouter.js:40:22
    

    Our use of Google Docs is actually quite low still, so we should work out how we're using this API and what the limits are early on and use it to inform our design decisions.

    bug cannot reproduce priority 3 - nice to have 
    opened by larsyencken 10
  • Webpack 5 🚀

    Webpack 5 🚀

    Live on: tufte

    Updates our infrastructure to finally be using Webpack 5, the new webpack cli, the new dev server, updated loaders and plugins, and all the good stuff. Everything works.

    opened by marcelgerber 10
  • fix: `tableForSelection` only contains entities that can be selected (for ScatterPlotChart, SlopeChart)

    fix: `tableForSelection` only contains entities that can be selected (for ScatterPlotChart, SlopeChart)

    Notion: ScatterPlot allows selecting entities not plotted on the chart

    This PR is live on tufte.

    This PR fixes that problem, by (optionally) moving tableForSelection to the chart instance, and using that one to populate the EntitySelectorModal. If a chart-level tableForSelection is not present, we fall back to using inputTable, as it was before.

    Chart comparison links:

    • Scatter plot 1: https://tufte.owid.cloud/admin/test/embeds?ids=245
    • Scatter plot 2: https://tufte.owid.cloud/admin/test/embeds?ids=4185
    • Slope chart: https://tufte.owid.cloud/admin/test/embeds?ids=414
    • all other chart types except for scatterplots and slope charts should be unaffected
    opened by marcelgerber 10
  • Generate GDocs from intermediate JSON

    Generate GDocs from intermediate JSON

    Once ArchieML JSon exists in our database we need the ability to create google docs documents containing the equivalent ArchieML text syntax.

    • [ ] Implement creation of google docs from ArchieML json
    • [ ] Verify with test pages that the created google docs behave as we would expect (i.e. they are editable, are fetched and rendered as expected)
    • [ ] Add the ability to create gdocs for a single post via the grapher admin page (for author driven conversion effort). Add a status field in the db that can take values like "unconverted", "in migration", "migrated" where the last status stops baking of this post via wordpress and instead takes them from gdoc
    • [ ] Consider if created pages need to be put into a hierarchy or similar to that ~600 google doc documents stay maintainable
    needs triage 
    opened by danyx23 0
  • Topic pages are not being indexed properly in Algolia

    Topic pages are not being indexed properly in Algolia

    When searching for "Poverty", our topic page is not the first result, and the shown snippet is not a great representation of the article.

    Moreover, we would like to be able to display the fact that it is a Topic Page (similar to how we currently do with Entries (see #1829)) but currently they are only tagged as "Pages"

    image

    feature needs discussion priority 3 - nice to have 
    opened by ikesau 1
  • 1749 admin styles leaking in gdocs preview iframe

    1749 admin styles leaking in gdocs preview iframe

    This isolate the preview in its own production-like iframe, so no admin styles are included.

    See https://github.com/owid/owid-grapher/issues/1749#issuecomment-1342863046 for a previous attempt using a shadow DOM.

    TODO

    • [ ] rename view / preview
    • [ ] review debug context setup
    • [ ] restore auto-refresh?
    opened by mlbrgl 0
  • chore(deps): bump json5 from 1.0.1 to 1.0.2 in /wordpress/web/app/plugins/owid

    chore(deps): bump json5 from 1.0.1 to 1.0.2 in /wordpress/web/app/plugins/owid

    Bumps json5 from 1.0.1 to 1.0.2.

    Release notes

    Sourced from json5's releases.

    v1.0.2

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295). This has been backported to v1. (#298)
    Changelog

    Sourced from json5's changelog.

    Unreleased [code, diff]

    v2.2.3 [code, diff]

    v2.2.2 [code, diff]

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295).

    v2.2.1 [code, diff]

    • Fix: Removed dependence on minimist to patch CVE-2021-44906. (#266)

    v2.2.0 [code, diff]

    • New: Accurate and documented TypeScript declarations are now included. There is no need to install @types/json5. (#236, #244)

    v2.1.3 [code, diff]

    • Fix: An out of memory bug when parsing numbers has been fixed. (#228, #229)

    v2.1.2 [code, diff]

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies javascript 
    opened by dependabot[bot] 0
  • WP backporting infrastructure and initial translation

    WP backporting infrastructure and initial translation

    This PR adds a script that iterates over the rows in the grapher posts table, takes the (HTML + wordpress comments) content and converts them to a roughly equivalent ArchieML json representation that is stored in the archieml column of the posts table.

    This PR now has what I think is a nice base infrastructure in place for this translation work but the work is not at all finished. Specifically, it only handles one wordpress component explicitly yet (columns) and while it adds a new compare view at /admin/posts/compare/POSTID, this view is super basic and just shows the post rendered via the old wordpress way and the new archieml way. The preview for the gdocs page fails to run the footer scripts ATM and thus doesn't show graphers - let's discuss which way we should go here.

    The metadata (authors, date modified etc) are not yet properly translated but I would add that in a separate PR.

    For more context please read this Notion page before reviewing.

    How to run/test this

    1. Run make up(.full) to build and have mysql up
    2. run node ./itsJustJavascript/db/migrateWpPostsToArchieMl.js. This will fetch all the rows form the posts table, run them through the backporting code and write the resulting ArchieML json into the archieml column of the posts table (and errors/stats into the archieml_update_statistics column)
    3. pick a post id and view the differences, e.g. http://localhost:8080/admin/posts/compare/54652

    The compare tool needs some love and we should brainstorm together what we want there

    opened by danyx23 1
Owner
Our World in Data
Research and data to make progress against the world’s largest problems
Our World in Data
Compose complex, data-driven visualizations from reusable charts and components with d3

d3.compose Compose rich, data-bound charts from charts (like Lines and Bars) and components (like Axis, Title, and Legend) with d3 and d3.chart. Advan

Cornerstone Systems 702 Jan 3, 2023
Repo for various Tesla internal data visualizations

teslarender Repo for various Tesla internal data visualizations $ http-server -g -c0 -p8899 Access at: http://localhost:8899/?http://fn.lc/s/depthre

Tristan Rice 29 Dec 15, 2022
A javascript library that extends D3.js to enable fast and beautiful visualizations.

d3plus D3plus is a JavaScript re-usable chart library that extends the popular D3.js to enable the easy creation of beautiful visualizations. Installi

D3plus 1.6k Dec 2, 2022
A web app that shows visualizations of the most used graphs algorithms such as BFS, DFS, Dijsktra, Minimum spanning tree, etc. It allows you to draw your own graph.

Graph Visualizer Draw your own graphs and visualize the most common graph algorithms This web application allows you to draw a graph from zero, with p

Gonzalo Pereira 31 Jul 29, 2022
JavaScript toolkit for creating interactive real-time graphs

Rickshaw Rickshaw is a JavaScript toolkit for creating interactive time series graphs, developed at Shutterstock Table of Contents Getting Started Ins

Shutterstock 6.5k Dec 28, 2022
A curated list of tools that can be used for creating interactive mathematical explorables.

A curated list of tools that can be used for creating interactive mathematical explorables.

Nikola Ubavić 75 Dec 22, 2022
Apache Superset is a Data Visualization and Data Exploration Platform

Superset A modern, enterprise-ready business intelligence web application. Why Superset? | Supported Databases | Installation and Configuration | Rele

The Apache Software Foundation 49.9k Dec 31, 2022
Apache ECharts is a powerful, interactive charting and data visualization library for browser

Apache ECharts Apache ECharts is a free, powerful charting and visualization library offering an easy way of adding intuitive, interactive, and highly

The Apache Software Foundation 53.8k Jan 9, 2023
📊 A highly interactive data-driven visualization grammar for statistical charts.

English | 简体中文 G2 A highly interactive data-driven visualization grammar for statistical charts. Website • Tutorial Docs • Blog • G2Plot G2 is a visua

AntV team 11.5k Dec 30, 2022
Apache ECharts is a powerful, interactive charting and data visualization library for browser

Apache ECharts Apache ECharts is a free, powerful charting and visualization library offering an easy way of adding intuitive, interactive, and highly

The Apache Software Foundation 53.8k Jan 5, 2023
Timeline/Graph2D is an interactive visualization chart to visualize data in time.

vis-timeline The Timeline/Graph2D is an interactive visualization chart to visualize data in time. The data items can take place on a single date, or

vis.js 1.2k Jan 3, 2023
🌀 The Javacript framework for creating a portal to your data. Perfect for a single dataset or a full catalog.

?? Portal.JS The javascript framework for data portals ?? portal is a framework for rapidly building rich data portal frontends using a modern fronten

Datopian 2k Dec 30, 2022
Make Your Company Data Driven. Connect to any data source, easily visualize, dashboard and share your data.

Redash is designed to enable anyone, regardless of the level of technical sophistication, to harness the power of data big and small. SQL users levera

Redash 22.4k Dec 30, 2022
JavaScript diagramming library for interactive flowcharts, org charts, design tools, planning tools, visual languages.

GoJS, a JavaScript Library for HTML Diagrams GoJS is a JavaScript and TypeScript library for creating and manipulating diagrams, charts, and graphs. S

Northwoods Software Corporation 6.6k Dec 30, 2022
:dango: An interactive and responsive charting library

English | 简体中文 G2Plot A charting library based on the Grammar of Graphics. G2Plot is an interactive and responsive charting library. Based on the gram

AntV team 2.3k Dec 30, 2022
vizflow is an ES6 interactive visualization engine

Vizflow vizflow.js - a render-loop library written using EcmaScript.6 (ES6) with no other external dependencies. Vizflow is a relatively small library

Vizflow 332 Oct 27, 2022
📱📈An elegant, interactive and flexible charting library for mobile.

中文 README F2 is born for mobile, developed for developers as well as designers. It is Html5 Canvas-based, and is also compatible with Node.js, Weex an

AntV team 7.8k Dec 31, 2022
📊 Interactive JavaScript Charts built on SVG

A modern JavaScript charting library to build interactive charts and visualizations with simple API. Our Partner ApexCharts is now a partner of Fusion

ApexCharts 12.1k Jan 3, 2023
Beautiful and interactive javascript charts for Java-based web applications.

Wicked Charts Beautiful and interactive JavaScript charts for Java-based web applications. Check out the Changelog Check out the Feature Overview with

adesso SE 85 Aug 23, 2022