: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
GD-UltraHack - A Mod Menu for Geometry Dash. Specifically a MegahackV5 clone in Python. Only for Windows

GD UltraHack: The Mod Menu that Nobody asked for. This is a mod menu for the gam

zeo 1 Jan 05, 2022
NumPy and Pandas interface to Big Data

Blaze translates a subset of modified NumPy and Pandas-like syntax to databases and other computing systems. Blaze allows Python users a familiar inte

Blaze 3.1k Jan 01, 2023
Cartopy - a cartographic python library with matplotlib support

Cartopy is a Python package designed to make drawing maps for data analysis and visualisation easy. Table of contents Overview Get in touch License an

1.2k Jan 01, 2023
Info for The Great DataTas plot-a-thon

The Great DataTas plot-a-thon Datatas is organising a Data Visualisation competition: The Great DataTas plot-a-thon We will be using Tidy Tuesday data

2 Nov 21, 2021
This project is created to visualize the system statistics such as memory usage, CPU usage, memory accessible by process and much more using Kibana Dashboard with Elasticsearch.

System Stats Visualizer This project is created to visualize the system statistics such as memory usage, CPU usage, memory accessible by process and m

Vishal Teotia 5 Feb 06, 2022
Render tokei's output to interactive sunburst chart.

Render tokei's output to interactive sunburst chart.

134 Dec 15, 2022
Python code for solving 3D structural problems using the finite element method

3DFEM Python 3D finite element code This python code allows for solving 3D structural problems using the finite element method. New features will be a

Rémi Capillon 6 Sep 29, 2022
Time series visualizer is a flexible extension that provides filling world map by country from real data.

Time-series-visualizer Time series visualizer is a flexible extension that provides filling world map by country from csv or json file. You can know d

Long Ng 3 Jul 09, 2021
cqMore is a CadQuery plugin based on CadQuery 2.1.

cqMore (under construction) cqMore is a CadQuery plugin based on CadQuery 2.1. Installation Please use conda to install CadQuery and its dependencies

Justin Lin 36 Dec 21, 2022
Create animated and pretty Pandas Dataframe or Pandas Series

Rich DataFrame Create animated and pretty Pandas Dataframe or Pandas Series, as shown below: Installation pip install rich-dataframe Usage Minimal exa

Khuyen Tran 92 Dec 26, 2022
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
Ana's Portfolio

Ana's Portfolio ✌️ Welcome to my Portfolio! You will find here different Projects I have worked on (from scratch) 💪 Projects 💻 1️⃣ Hangman game (Mad

Ana Katherine Cortes Sobrino 9 Mar 15, 2022
Customizing Visual Styles in Plotly

Customizing Visual Styles in Plotly Code for a workshop originally developed for an Unconference session during the Outlier Conference hosted by Data

Data Design Dimension 9 Aug 03, 2022
Flow-based visual scripting for Python

A simple visual node editor for Python Ryven combines flow-based visual scripting with Python. It gives you absolute freedom for your nodes and a simp

Leon Thomm 3.1k Jan 06, 2023
Exploratory analysis and data visualization of aircraft accidents and incidents in Brazil.

Exploring aircraft accidents in Brazil Occurrencies with aircraft in Brazil are investigated by the Center for Investigation and Prevention of Aircraf

Augusto Herrmann 5 Dec 14, 2021
🧇 Make Waffle Charts in Python.

PyWaffle PyWaffle is an open source, MIT-licensed Python package for plotting waffle charts. It provides a Figure constructor class Waffle, which coul

Guangyang Li 528 Jan 02, 2023
A Graph Learning library for Humans

A Graph Learning library for Humans These novel algorithms include but are not limited to: A graph construction and graph searching class can be found

Richard Tjörnhammar 1 Feb 08, 2022
Python module for drawing and rendering beautiful atoms and molecules using Blender.

Batoms is a Python package for editing and rendering atoms and molecules objects using blender. A Python interface that allows for automating workflows.

Xing Wang 1 Jul 06, 2022
Python support for Godot 🐍🐍🐍

Godot Python, because you want Python on Godot ! The goal of this project is to provide Python language support as a scripting module for the Godot ga

Emmanuel Leblond 1.4k Jan 04, 2023
Interactive Dashboard for Visualizing OSM Data Change

Dashboard and intuitive data downloader for more interactive experience with interpreting osm change data.

1 Feb 20, 2022