:bowtie: Create a dashboard with python!

Overview

Installation | Documentation | Gitter Chat | Google Group

Bowtie

Build Status Documentation Status PyPI version Conda version PyPI codecov prettier

Bowtie Demo

Introduction

Bowtie is a library for writing dashboards in Python. No need to know web frameworks or JavaScript, focus on building functionality in Python. Interactively explore your data in new ways! Deploy and share with others!

Demo

See a live example generated from this code!

Gallery

For more examples, check out the gallery and repos. Feel free to add your own creations!

Installation

If you use conda, you can install with:

conda install -c conda-forge bowtie-py

If you use pip, you can install with:

pip install bowtie

Requirements

Bowtie uses Yarn to manage node packages. If you installed Bowtie through conda, Yarn was also installed as a dependency. Yarn can be installed through conda:

conda install -c conda-forge yarn

Otherwise follow install instructions for Yarn for your OS.

Documentation

Available here.

Jupyter Integration

An early integration with Jupyter has been prototyped. I encourage you to try it out and share feedback. I hope this will make it easier to make Bowtie apps.

Read the documentation for more details.

Docker

Docker images are provided as an alternative way to use Bowtie. They are available on Docker Hub:

docker pull jwkvam/bowtie

Read the documentation for more details.

The Goal

@astrobiased @treycausey @vagabondjack the lack of a comprehensive production-grade Shiny-alike for Python is a Big Problem

Contributing

You can help Bowtie in many ways including:

  • Try it out and report bugs or what was difficult.
  • Help improve the documentation.
  • Write new widgets.
  • Provide hosting for apps in the gallery.
  • Say thanks!

coffee

Comments
  • Error with cache.load

    Error with cache.load

    I'm getting an error when I use bowtie.cache.load. As far as I can tell, the correct value is loading and everything functions normally. I'm not sure where this error comes from. I'm also using Schedule, but I managed to get that to work fine when not loading from the cache.

    As I make more changes, I may be able to give more details about this.

      File "/Users/rsm5139/anaconda3/envs/learning-bowtie/lib/python3.6/site-packages/eventlet/greenthread.py", line 218, in main
        result = function(*args, **kwargs)
      File "./build/src/server.py", line 59, in foo
        func()
      File "/Users/rsm5139/Git/learning-bowtie/step_1.py", line 23, in timed_event
        ticker = cache.load('scheduled')
      File "/Users/rsm5139/anaconda3/envs/learning-bowtie/lib/python3.6/site-packages/bowtie/cache.py", line 58, in load
        return msgpack.unpackb(bytes(event.get(timeout=10)), encoding='utf8')
      File "/Users/rsm5139/anaconda3/envs/learning-bowtie/lib/python3.6/site-packages/eventlet/queue.py", line 313, in get
        return waiter.wait()
      File "/Users/rsm5139/anaconda3/envs/learning-bowtie/lib/python3.6/site-packages/eventlet/queue.py", line 141, in wait
        return get_hub().switch()
      File "/Users/rsm5139/anaconda3/envs/learning-bowtie/lib/python3.6/site-packages/eventlet/hubs/hub.py", line 295, in switch
        return self.greenlet.switch()
    queue.Empty
    ^Cwsgi exiting
    
    opened by rsm5139 8
  • What can Schedule do?

    What can Schedule do?

    Hi, I'm trying to use Schedule, but it doesn't seem to do anything. I had it call a function to create a plot, but that didn't work. Then I tried having it just print('hello'), but still nothing. I would like to add a timer to the app and I figured Schedule would help, but maybe not.

    bug work-around 
    opened by rsm5139 5
  • ImportError: No module named html

    ImportError: No module named html

    I'm stuck trying to run the example code: https://github.com/jwkvam/bowtie-demo/blob/master/example.py

    I believe I have all dependencies installed via conda and pip (plotlywrapper), and I've tried running it in several environments and consoles.

    #!/usr/bin/env python ... # -- coding: utf-8 -- ... ... from bowtie import App, command ... from bowtie.control import Dropdown, Slider ... from bowtie.visual import Plotly, Table ... from bowtie.html import Markdown ... ... import numpy as np ... import pandas as pd ... import plotlywrapper as pw ... ... from sklearn.kernel_ridge import KernelRidge ... ... iris = pd.read_csv('./iris.csv') ... iris = iris.drop(iris.columns[0], axis=1) ... ... attrs = iris.columns[:-1] ... ... description = Markdown("""Bowtie Demo ... =========== ... ... Demonstrates interactive elements with the iris dataset. ... Select some attributes to plot and select some data on the 2d plot. ... Change the alpha parameter to see how that affects the model. ... """) ... ... xdown = Dropdown(caption='X variable', labels=attrs, values=attrs) ... ydown = Dropdown(caption='Y variable', labels=attrs, values=attrs) ... zdown = Dropdown(caption='Z variable', labels=attrs, values=attrs) ... alphaslider = Slider(caption='alpha parameter', start=10, minimum=1, maximum=50) ... ... mainplot = Plotly() ... mplot3 = Plotly() ... linear = Plotly() ... table1 = Table() ... ... ... def pairplot(x, y): ... print('hellox') ... if x is None or y is None: ... return ... x = x['value'] ... y = y['value'] ... plot = pw.Chart() ... for i, df in iris.groupby('Species'): ... plot += pw.scatter(df[x], df[y], label=i) ... plot.xlabel(x) ... plot.ylabel(y) ... mainplot.do_all(plot.to_json()) ... ... ... def threeplot(x, y, z): ... if x is None or y is None or z is None: ... return ... x = x['value'] ... y = y['value'] ... z = z['value'] ... plot = pw.Chart() ... for i, df in iris.groupby('Species'): ... plot += pw.scatter3d(df[x], df[y], df[z], label=i) ... plot.xlabel(x) ... plot.ylabel(y) ... plot.zlabel(z) ... mplot3.do_all(plot.to_json()) ... ... ... def mainregress(selection, alpha): ... if len(selection) < 2: ... return ... ... x = xdown.get()['value'] ... y = ydown.get()['value'] ... ... tabdata = [] ... mldatax = [] ... mldatay = [] ... species = iris.Species.unique() ... for i, p in enumerate(selection['points']): ... mldatax.append(p['x']) ... mldatay.append(p['y']) ... tabdata.append({ ... x: p['x'], ... y: p['y'], ... 'species': species[p['curve']] ... }) ... ... ... X = np.c_[mldatax, np.array(mldatax) ** 2] ... ridge = KernelRidge(alpha=alpha).fit(X, mldatay) ... ... xspace = np.linspace(min(mldatax)-1, max(mldatax)+1, 100) ... ... plot = pw.scatter(mldatax, mldatay, label='train', markersize=15) ... for i, df in iris.groupby('Species'): ... plot += pw.scatter(df[x], df[y], label=i) ... plot += pw.line(xspace, ridge.predict(np.c_[xspace, xspace**2]), label='model', mode='lines') ... plot.xlabel(x) ... plot.ylabel(y) ... linear.do_all(plot.to_json()) ... table1.do_data(pd.DataFrame(tabdata)) ... ... ... @command ... def main(): ... app = App(rows=2, columns=3, background_color='PaleTurquoise', debug=False) ... app.columns[0].fraction(2) ... app.columns[1].fraction(1) ... app.columns[2].fraction(1) ... ... app.add_sidebar(description) ... app.add_sidebar(xdown) ... app.add_sidebar(ydown) ... app.add_sidebar(zdown) ... app.add_sidebar(alphaslider) ... ... app[0, 0] = mainplot ... app[0, 1:] = mplot3 ... app[1, :2] = linear ... app[1, 2] = table1 ... ... app.subscribe(pairplot, xdown.on_change, ydown.on_change) ... app.subscribe(threeplot, xdown.on_change, ydown.on_change, zdown.on_change) ... app.subscribe(mainregress, mainplot.on_select, alphaslider.on_change) ... ... return app ... ImportError: No module named html ImportErrorTraceback (most recent call last) in () 5 from bowtie.control import Dropdown, Slider 6 from bowtie.visual import Plotly, Table ----> 7 from bowtie.html import Markdown 8 9 import numpy as np ImportError: No module named html

    opened by willupowers 3
  • make widgets with minimum size?

    make widgets with minimum size?

    I'm working on a dashboard where i'd like to stack 3 widgets, but on my screen they render with very small heights... is there a way to forece them to occupy a minimum height?

    image

    opened by dswah 3
  • ERROR in ./src/app/nouislider.jsx

    ERROR in ./src/app/nouislider.jsx

    ERROR in ./src/app/nouislider.jsx Module not found: Error: Cannot resolve module 'nouislider/src/nouislider.css' in /Users/wesselhuising/Documents/triplea/bowtie/test/build/src/app @ ./src/app/nouislider.jsx 15:0-40

    Using a virtualenv, followed the documentation about installing and setting up a bowtie app. Tried a lot, but can't figure out how to make the npm use the compiler of less to create a css. This happens while building the example app in the quickstart of the documentation.

    Any thoughts?

    opened by wesselhuising 2
  • support for initial function

    support for initial function

    It would be handy to have a function that get's called on initial page load from the client. Here's a sketch of how this can work:

    1. Add an emit from index.jsx
    2. Add a handler template in server.py
    3. Add functionality to Layout class to call a python function on the initial signal.
    moderate 
    opened by jwkvam 2
  • WIP: serverless

    WIP: serverless

    Put server.py.j2 functions into App class.

    • [x] move all routes to App
    • [x] remove server.py.j2
    • [x] test notebook integration still works
    • [x] different endpoint for each route
    • [x] move authentication
    • [x] document authentication
    • [x] decorator for upload and load
    • [x] run layout at build
    • [x] test upload
    • [x] protect routes in serve
    • [x] ~document layout building function~
    • [x] test pager
    • [x] test init

    Fixes #234 #247

    reliability 
    opened by jwkvam 1
  • move example code towards convention of global app

    move example code towards convention of global app

    For dynamic layouts, the app will need to be global or at least the views will be. I would rather not confuse the matter and encourage the app to be global. As a side benefit, users can then use the listen decorator instead of the subscribe function which should be more readable. This may also allow us to be more compatible with Flask apps if someone wants to have a bowtie dashboard sitting with some other flask stuff.

    • [x] refactor example code
    • [x] refactor bowtie-demo
    • [x] move server.py.j2 functionality into app.py or wherever appropriate.
    enhancement user experience 
    opened by jwkvam 1
  • release v0.10

    release v0.10

    TODO

    • [x] remove captions from controllers
    • [x] ~~move markdown back to visual :/~~
    • [x] move react link to html
    • [x] ~~functional style for html widgets? (no events or commands)~~
    • [x] make it easy to create captions
    • [x] list of components for each cell
    • [ ] embed links in other html? children in div's?
    • [ ] put server.py template into bowtie proper
    • [ ] change convention to putting app as global variable

    Fixes #236

    opened by jwkvam 1
  • Proposing a PR to fix a few small typos

    Proposing a PR to fix a few small typos

    Issue Type

    [x] Bug (Typo)

    Steps to Replicate and Expected Behaviour

    • Examine bowtie/tests/test_components.py and observe instatiation, however expect to see instantiation.
    • Examine bowtie/tests/test_tags.py and observe instantation, however expect to see instantiation.

    Notes

    Semi-automated issue generated by https://github.com/timgates42/meticulous/blob/master/docs/NOTE.md

    To avoid wasting CI processing resources a branch with the fix has been prepared but a pull request has not yet been created. A pull request fixing the issue can be prepared from the link below, feel free to create it or request @timgates42 create the PR. Alternatively if the fix is undesired please close the issue with a small comment about the reasoning.

    https://github.com/timgates42/bowtie/pull/new/bugfix_typos

    Thanks.

    opened by timgates42 0
  • Error building with webpack

    Error building with webpack

    yarn install v1.22.4
    warning package.json: No license field
    warning No license field
    [1/4] Resolving packages...
    success Already up-to-date.
    Done in 0.45s.
    '.' is not recognized as an internal or external command,
    operable program or batch file.
    Traceback (most recent call last):
      File "example.py", line 126, in <module>
        def main():
      File "C:\Users\sabar\.conda\envs\Drug_Analysis\lib\site-packages\bowtie\_command.py", line 103, in command
        sys.exit(cmd(arg))
      File "C:\Users\sabar\.conda\envs\Drug_Analysis\lib\site-packages\click\core.py", line 829, in __call__
        return self.main(*args, **kwargs)
      File "C:\Users\sabar\.conda\envs\Drug_Analysis\lib\site-packages\click\core.py", line 782, in main
        rv = self.invoke(ctx)
      File "C:\Users\sabar\.conda\envs\Drug_Analysis\lib\site-packages\click\core.py", line 1259, in invoke
        return _process_result(sub_ctx.command.invoke(sub_ctx))
      File "C:\Users\sabar\.conda\envs\Drug_Analysis\lib\site-packages\click\core.py", line 1066, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "C:\Users\sabar\.conda\envs\Drug_Analysis\lib\site-packages\click\core.py", line 610, in invoke
        return callback(*args, **kwargs)
      File "C:\Users\sabar\.conda\envs\Drug_Analysis\lib\site-packages\bowtie\_command.py", line 61, in build
        app._build()
      File "C:\Users\sabar\.conda\envs\Drug_Analysis\lib\site-packages\bowtie\_app.py", line 949, in _build
        raise WebpackError('Error building with webpack')
    bowtie.exceptions.WebpackError: Error building with webpack
    
    opened by SabarishVT 0
  • Divs should be able to have children html components

    Divs should be able to have children html components

    Main use case is to have links in divs so the links can be embedded in text. Using links like this will help with single page apps with multiple views.

    enhancement user experience 
    opened by jwkvam 0
  • improve margins look and feel and API

    improve margins look and feel and API

    By default there is 0 border around the edge of the screen. This is visually unattractive and there is no way to change it with the bowtie API. This is to note that this can and should be improved.

    Thoughts:

    1. Should this be combined with the row/column gaps?
    2. Take inspiration from other APIs, such as matplotlib's margins?
    enhancement user experience 
    opened by jwkvam 0
  • test restoring state for all components

    test restoring state for all components

    not sure how easy this will be, but it will add assurance that refreshing hopefully works or at the very least doesn't break the app.

    Basic test structure:

    1. Build app
    2. Use selenium to interact with widget.
    3. Refresh web page
    4. Make sure the page loaded successfully.
    5. Extra credit: make sure the state is same as it was before refresh.

    widgets tested

    • [ ] dates
    • [ ] dropdown etc.
    reliability 
    opened by jwkvam 0
Releases(v0.11.0)
  • v0.11.0(Oct 13, 2018)

    Added

    • Start of Authentication API
    • Better interoperability with Flask
    • Views have a layout attribute that is run a build time, which can save time at serve time.

    Breaking

    • Apps layout now happens in global state or in layout functions.
    • Remove server.py and templates, bundle.js{,.gz} is placed directly in build directory.
    • load and subscribe are decorators now, simplifying usage.
    • Sidebar now defaults to False.
    • Removed respond function, moved feature to subscribe.
    Source code(tar.gz)
    Source code(zip)
  • v0.10.1(Oct 4, 2018)

  • v0.10.0(Oct 3, 2018)

    Added

    • Mostly internal changes so that dynamic layout can be supported.
    • Dropped Python 3.5 compatibility.
    • Added Python 3.7 support. (#233)
    • Update random walk so it can be used with multiple users. (#126)
    • Views now have a border attribute for specifying a margin around the whole page, defaults to 7 pixels.
    • Add multiple components to a cell or span, for example:

      app = App() app[0, 0] = button app[0, 0] += button2 Or app = App() app[0, 0] = button, button2

    • Moved link component from control to html module

    Fixed

    • Bug with rebuilding apps due to caching problems.
    • Bug when refreshing apps with date pickers, the stored state wasn't being restored correctly.

    Breaking

    • Captions in controllers have been removed, they can be replaced with HTML components.
    Source code(tar.gz)
    Source code(zip)
  • v0.9.1(Mar 3, 2018)

    Added

    • Upgraded to webpack 4, users shouldn't see much of a difference other than slightly improved build times.

    Fixed

    • Readthedocs wasn't rendering due to type hints, fixed with conda.
    Source code(tar.gz)
    Source code(zip)
  • v0.9.0(Feb 23, 2018)

    Added

    • Jupyter integration.
    • Basic HTML components: Div and H1-H6.
    • Add multiple components into a single span/cell. This can be useful for adding multiple control or html elements into a single cell.

    Breaking

    • Drop support for Python 2.
    • Moved Markdown widget to HTML components.
    Source code(tar.gz)
    Source code(zip)
  • v0.8.1(Feb 11, 2018)

  • v0.8.0(Feb 10, 2018)

    Added

    • Improved widget handling, now use a dict to store components instead of parsing code. Makes it possible to subscribe to events with expressions for the component.
    • Cache behaves like dict, e.g. cache['data'] = [1, 2, 3].
    • Support Ant theme to customize all Ant components, added in the App class.
    • Vertical option for slider. (#204)
    • Document run command.
    • Document exceptions.

    Breaking

    • Removed cache save and load functions in favor of dict functionality.
    Source code(tar.gz)
    Source code(zip)
  • v0.7.0(Feb 4, 2018)

    Added

    • Implemented __getitem__ for the layout enabling for example: app[1, 0:2] = widget.
    • Added "on_relayout" event for Plotly widgets.
    • Serialize Pandas series objects and Pandas datetime objects.

    Breaking

    • row_end and column_end are now exclusive instead of inclusive.
    • Simplified the add function in favor of the new getitem functionality, which is easier to use and familiar to Python programmers.
    Source code(tar.gz)
    Source code(zip)
  • v0.6.1(Feb 2, 2018)

    Added

    • Docstring examples of sizing components.
    • More checks to ensure adding components works as expected.

    Fixed

    • Bug which incorrectly tracked which parts of the grid were occupied by widgets.
    Source code(tar.gz)
    Source code(zip)
  • v0.6.0(Feb 1, 2018)

    Added

    • Removed node and webpack dependencies, the only dependency is yarn.
    • Added a run command that simply combines build and serve together.
    • Smarter build process that saves time on subsequent builds.
    • Handle scheduled tasks when running with debug=True (#185)
    • Improve the Docker experience and docs.
    • Always use the latest compiled bundle.

    Breaking

    • Instead of building the app by running app.build() you simply return the App instance. See the quick start guide for an example.
    Source code(tar.gz)
    Source code(zip)
  • v0.5.1(Dec 31, 2017)

    Added

    • Expose root View attributes as App attributes (#175). You can access columns and rows from the App instance like pre v0.5.
    • Added column and row gap which inserts space between rows and columns. Accessible through column_gap and row_gap on View and App instances.
    • Added Gitter chat (#179)
    • Many documentation improvements.
    • Drop Python 3.4 support following pandas lead.
    Source code(tar.gz)
    Source code(zip)
  • v0.5.0(Nov 20, 2017)

    Added

    • Create multiple views to create subpages (#158)
    • Cache is now backed by session storage (#160)
    • Link component for switching views without a page reload

    Breaking

    • Renamed Layout class to App
    Source code(tar.gz)
    Source code(zip)
  • v0.4.2(Sep 5, 2017)

  • v0.4.1(Jul 30, 2017)

    Added

    • Upload widget
    • Dockerfile for building apps

    Fixed

    • Refactored the data Plotly sends on selection to stop crashes, may break some apps
    Source code(tar.gz)
    Source code(zip)
  • v0.4.0(Jun 17, 2017)

  • v0.3.3(Jun 14, 2017)

    Added

    • new textbox feature to update text (#128)

    Fixed

    • fixed issue preventing controllers from added to layout (#128)
    • updated Layout docstring (#125)
    Source code(tar.gz)
    Source code(zip)
  • v0.3.2(Apr 27, 2017)

    Added

    • Support changing socket.io path for nginx (#118)
    • Pager: to request communication from the client (#122)

    Fixed

    • Nouislider
    • Random walk example
    • pydocstyle suggestions
    Source code(tar.gz)
    Source code(zip)
  • v0.3.1(Apr 17, 2017)

  • v0.3.0(Apr 14, 2017)

    Added

    • New more flexible and powerful layout API.
    • Now using CSS Grid instead of Flexbox.
    • Sidebar is now optional.
    • Control widgets can be placed anywhere.

    Breaking

    • add_visual is now simply add
    • add_controller is now add_sidebar
    • DropDown is renamed to Dropdown
    Source code(tar.gz)
    Source code(zip)
  • v0.2.6(Mar 30, 2017)

  • v0.2.5(Mar 30, 2017)

  • v0.2.4(Mar 30, 2017)

  • v0.2.3(Mar 30, 2017)

  • v0.2.2(Mar 30, 2017)

  • v0.2.1(Mar 30, 2017)

  • v0.2.0(Mar 30, 2017)

Owner
Jacques Kvam
I like machine learning 🤖and building tools for machine learning🛠⚙️🔩 https://ghuser.io/jwkvam
Jacques Kvam
A simple interpreted language for creating basic mathematical graphs.

graphr Introduction graphr is a small language written to create basic mathematical graphs. It is an interpreted language written in python and essent

2 Dec 26, 2021
A library for bridging Python and HTML/Javascript (via Svelte) for creating interactive visualizations

A library for bridging Python and HTML/Javascript (via Svelte) for creating interactive visualizations

Anthropic 98 Dec 27, 2022
Graphical display tools, to help students debug their class implementations in the Carcassonne family of projects

carcassonne_tools Graphical display tools, to help students debug their class implementations in the Carcassonne family of projects NOTE NOTE NOTE The

1 Nov 08, 2021
A tool for creating SVG timelines from simple JSON input.

A tool for creating SVG timelines from simple JSON input.

Jason Reisman 432 Dec 30, 2022
UNMAINTAINED! Renders beautiful SVG maps in Python.

Kartograph is not maintained anymore As you probably already guessed from the commit history in this repo, Kartograph.py is not maintained, which mean

1k Dec 09, 2022
These data visualizations were created for my introductory computer science course using Python

Homework 2: Matplotlib and Data Visualization Overview These data visualizations were created for my introductory computer science course using Python

Sophia Huang 12 Oct 20, 2022
Yata is a fast, simple and easy Data Visulaization tool, running on python dash

Yata is a fast, simple and easy Data Visulaization tool, running on python dash. The main goal of Yata is to provide a easy way for persons with little programming knowledge to visualize their data e

Cybercreek 3 Jun 28, 2021
Regress.me is an easy to use data visualization tool powered by Dash/Plotly.

Regress.me Regress.me is an easy to use data visualization tool powered by Dash/Plotly. Regress.me.-.Google.Chrome.2022-05-10.15-58-59.mp4 Get Started

Amar 14 Aug 14, 2022
ICS-Visualizer is an interactive Industrial Control Systems (ICS) network graph that contains up-to-date ICS metadata

ICS-Visualizer is an interactive Industrial Control Systems (ICS) network graph that contains up-to-date ICS metadata (Name, company, port, user manua

QeeqBox 2 Dec 13, 2021
Tools for calculating and visualizing Elo-like ratings of MLB teams using Retosheet data

Overview This project uses historical baseball games data to calculate an Elo-like rating for MLB teams based on regular season match ups. The Elo rat

Lukas Owens 0 Aug 25, 2021
Matplotlib JOTA style for making figures

Matplotlib JOTA style for making figures This repo has Matplotlib JOTA style to format plots and figures for publications and presentation.

JOTA JORNALISMO 2 May 05, 2022
Draw tree diagrams from indented text input

Draw tree diagrams This repository contains two very different scripts to produce hierarchical tree diagrams like this one: $ ./classtree.py collectio

Luciano Ramalho 8 Dec 14, 2022
Automatically Visualize any dataset, any size with a single line of code. Created by Ram Seshadri. Collaborators Welcome. Permission Granted upon Request.

AutoViz Automatically Visualize any dataset, any size with a single line of code. AutoViz performs automatic visualization of any dataset with one lin

AutoViz and Auto_ViML 1k Jan 02, 2023
Declarative statistical visualization library for Python

Altair http://altair-viz.github.io Altair is a declarative statistical visualization library for Python. With Altair, you can spend more time understa

Altair 8k Jan 05, 2023
Simple Python interface for Graphviz

Simple Python interface for Graphviz

Sebastian Bank 1.3k Dec 26, 2022
A simple code for plotting figure, colorbar, and cropping with python

Python Plotting Tools This repository provides a python code to generate figures (e.g., curves and barcharts) that can be used in the paper to show th

Guanying Chen 134 Jan 02, 2023
Eulera Dashboard is an easy and intuitive way to get a quick feel of what’s happening on the world’s market.

an easy and intuitive way to get a quick feel of what’s happening on the world’s market ! Eulera dashboard is a tool allows you to monitor historical

Salah Eddine LABIAD 4 Nov 25, 2022
Curvipy - The Python package for visualizing curves and linear transformations in a super simple way

Curvipy - The Python package for visualizing curves and linear transformations in a super simple way

Dylan Tintenfich 55 Dec 28, 2022
Realtime Web Apps and Dashboards for Python and R

H2O Wave Realtime Web Apps and Dashboards for Python and R New! R Language API Build and control Wave dashboards using R! New! Easily integrate AI/ML

H2O.ai 3.4k Jan 06, 2023
This package creates clean and beautiful matplotlib plots that work on light and dark backgrounds

This package creates clean and beautiful matplotlib plots that work on light and dark backgrounds. Inspired by the work of Edward Tufte.

Nico Schlömer 205 Jan 07, 2023