Your interactive network visualizing dashboard

Related tags

Deep Learningjaal
Overview

jaal logo

PyPI GitHub GitHub Repo stars

Your interactive network visualizing dashboard

Documentation: Here

What is Jaal

Jaal is a python based interactive network visualizing tool built using Dash and Visdcc. Along with the basic features, Jaal also provides multiple option to play with the network data such as searching graph, filtering and even coloring nodes and edges in the graph. And all of this within 2 lines of codes :)

Requirements

Jaal requires following python packages,

  1. Dash
    • dash_core_components
    • dash_html_components
  2. dash_bootstrap_components
  3. visdcc
  4. pandas

Install

Installing Jaal is super easy, just do the following,

pip install jaal

And you are done :)

Note, it's recommended to create a virtual enivornment before installing. This can be easily done using python -m venv myenv and then to activate the env we need,

  1. (Windows) .\\myvenv\\Scripts\\activate.bat
  2. (Linux) source myvenv/bin/activate

Getting started

After installing Jaal, we need to fetch the data and call plot function in Jaal. This can be shown by playing with an included Game of Thrones dataset, as follows,

# import
from jaal import Jaal
from jaal.datasets import load_got
# load the data
edge_df, node_df = load_got()
# init Jaal and run server
Jaal(edge_df, node_df).plot()

Here first we import Jaal main class and the dataset loading function load_got. Later we load the GoT dataset from the datasets included in the package. This gives us two files,

  1. edge_df: its a pandas dataframe with atleast from and to column, which represents the edge relationship between the entities
  2. node_df: its an optional parameter, but should contains a id column with unique node names.

Note, edge_df is mandatory and node_df is optional. Also we can include additional columns in these files which are automatically conidered as edge or node features respectively.

After running the plot, the console will prompt the default localhost address (127.0.0.1:8050) where Jaal is running. Access it to see the following dashboard,

dashboard

Features

At present, the dashboard consist of following sections,

  1. Setting panel: here we can play with the graph data, i further contain following sections,
    • Search: can be used to highlight a node in graph
    • Filter: supports pandas query language and can be used to filter the graph data based on nodes or edge features.
    • Color: can be used to color nodes or edges based on their categorical features. Note, currently only features with at max 20 cardinality are supported.
  2. Graph: the network graph in all its glory :)

Examples

1. Searching

dashboard

2. Filtering

dashboard

3. Coloring

dashboard

Extra settings

Display edge label

To display labels over edges, we need to add a label attribute (column) in the edge_df. Also, it has to be in string format. For example, using the GoT dataset, by adding the following line before the Jaal call, we can display the edge labels.

# add edge labels
edge_df.loc[:, 'label'] = edge_df.loc[:, 'weight'].astype(str)

Directed edges

By default, Jaal plot undirected edges. This setting can be changed by,

Jaal(edge_df, node_df).plot(directed=True)

Issue tracker

Please report any bug or feature idea using Jaal issue tracker: https://github.com/imohitmayank/jaal/issues

Collaboration

Any type of collaboration is appreciated. It could be testing, development, documentation and other tasks that is useful to the project. Feel free to connect with me regarding this.

Contact

You can connect with me on LinkedIn or mail me at [email protected].

License

Jaal is licensed under the terms of the MIT License (see the file LICENSE).

Comments
  • Deploy In Heroku

    Deploy In Heroku

    Hi I can run the app in local easily But after following the heroku guide in official dash site at Link It says that server address is wrong which seems related to plot() server and port parameters How can i setup Jaal to run in heroku ? Thanks for Great repo

    opened by NinjaAtWork 9
  • Legend for the color and slow down the movement of the node

    Legend for the color and slow down the movement of the node

    Hi,

    Thank you for this cool visualization. I am trying to use this for my network. It works really well. I have some suggestions as follows.

    1. When coloring the nodes/edges, it's hard to tell which color is what. So, it would be great to see the legend
    2. In my network, some nodes have quite many neighbors which make the sub-graph moving quite fast. It may be better to keep the network more still.

    Thank you!

    opened by chaupmcs 5
  • Server runs but the graph won't load.

    Server runs but the graph won't load.

    I have a pandas dataframe of edges:

         from   to
    0       1   39
    1       3   41
    2       5   43
    3       7   45
    4       9   47
    ...   ...  ...
    1507  805  807
    1508  807  809
    1509  809  811
    1510  811  813
    1511  813  779
    
    [1512 rows x 2 columns]
    
    from    object
    to      object
    dtype: object
    

    The server runs and I see the dashboard but the graph does not load.

    I am getting this error:

    Dash is running on http://127.0.0.1:8050/
    
     * Serving Flask app "test" (lazy loading)
     * Environment: production
       WARNING: This is a development server. Do not use it in a production deployment.
       Use a production WSGI server instead.
     * Debug mode: off
     * Running on http://127.0.0.1:8050/ (Press CTRL+C to quit)
    127.0.0.1 - - [02/Feb/2021 13:36:54] "GET / HTTP/1.1" 200 -
    127.0.0.1 - - [02/Feb/2021 13:36:55] "GET /_dash-dependencies HTTP/1.1" 200 -
    127.0.0.1 - - [02/Feb/2021 13:36:55] "GET /_dash-layout HTTP/1.1" 200 -
    No trigger
    [2021-02-02 13:36:56,269] ERROR in app: Exception on /_dash-update-component [POST]
    Traceback (most recent call last):
      File "C:\Program Files\Python_3_7_4\lib\site-packages\dash\dash.py", line 1041, in add_context
        response, cls=plotly.utils.PlotlyJSONEncoder
      File "C:\Program Files\Python_3_7_4\lib\json\__init__.py", line 238, in dumps
        **kw).encode(obj)
      File "C:\Program Files\Python_3_7_4\lib\site-packages\_plotly_utils\utils.py", line 59, in encode
        encoded_o = super(PlotlyJSONEncoder, self).encode(o)
      File "C:\Program Files\Python_3_7_4\lib\json\encoder.py", line 199, in encode
        chunks = self.iterencode(o, _one_shot=True)
      File "C:\Program Files\Python_3_7_4\lib\json\encoder.py", line 257, in iterencode
        return _iterencode(o, 0)
      File "C:\Program Files\Python_3_7_4\lib\site-packages\_plotly_utils\utils.py", line 134, in default
        return _json.JSONEncoder.default(self, obj)
      File "C:\Program Files\Python_3_7_4\lib\json\encoder.py", line 179, in default
        raise TypeError(f'Object of type {o.__class__.__name__} '
    TypeError: Object of type type is not JSON serializable
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "C:\Program Files\Python_3_7_4\lib\site-packages\flask\app.py", line 2447, in wsgi_app
        response = self.full_dispatch_request()
      File "C:\Program Files\Python_3_7_4\lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
        rv = self.handle_user_exception(e)
      File "C:\Program Files\Python_3_7_4\lib\site-packages\flask\app.py", line 1821, in handle_user_exception
        reraise(exc_type, exc_value, tb)
      File "C:\Program Files\Python_3_7_4\lib\site-packages\flask\_compat.py", line 39, in reraise
        raise value
      File "C:\Program Files\Python_3_7_4\lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
        rv = self.dispatch_request()
      File "C:\Program Files\Python_3_7_4\lib\site-packages\flask\app.py", line 1936, in dispatch_request
        return self.view_functions[rule.endpoint](**req.view_args)
      File "C:\Program Files\Python_3_7_4\lib\site-packages\dash\dash.py", line 1078, in dispatch
        response.set_data(func(*args, outputs_list=outputs_list))
      File "C:\Program Files\Python_3_7_4\lib\site-packages\dash\dash.py", line 1044, in add_context
        _validate.fail_callback_output(output_value, output)
      File "C:\Program Files\Python_3_7_4\lib\site-packages\dash\_validate.py", line 261, in fail_callback_output
        _validate_value(val, index=i)
      File "C:\Program Files\Python_3_7_4\lib\site-packages\dash\_validate.py", line 256, in _validate_value
        toplevel=True,
      File "C:\Program Files\Python_3_7_4\lib\site-packages\dash\_validate.py", line 210, in _raise_invalid
        bad_val=bad_val,
    dash.exceptions.InvalidCallbackReturnValue: The callback for `<Output `graph.data`>`
    returned a value having type `type`
    which is not JSON serializable.
    
    
    The value in question is either the only value returned,
    or is in the top level of the returned list,
    
    and has string representation
    `<class 'dash.exceptions.PreventUpdate'>`
    
    In general, Dash properties can only be
    dash components, strings, dictionaries, numbers, None,
    or lists of those.
    127.0.0.1 - - [02/Feb/2021 13:36:56] "POST /_dash-update-component HTTP/1.1" 500 -
    
    
    opened by jamesgrogantech 5
  • Launch in Dash

    Launch in Dash

    This is a reallly fun project, have you perhaps already developed a way to integrate this within a dash app (embed it somehow), if so a tutorial would be appreaciated, kudos for the project.

    opened by firmai 2
  • error while running this code

    error while running this code

    from jaal import Jaal from dash import dcc from jaal.datasets import load_got edge_df, node_df = load_got() Jaal(edge_df, node_df).plot()

    ValueError Traceback (most recent call last) in 1 # init Jaal and run server ----> 2 Jaal(edge_df, node_df).plot()

    ~/anaconda3/envs/python3/lib/python3.6/site-packages/jaal/jaal.py in plot(self, debug, host, port, directed) 148 Input('color_nodes', 'value'), 149 Input('color_edges', 'value')], --> 150 state=State('graph', 'data') 151 ) 152 def setting_pane_callback(search_text, filter_nodes_text, filter_edges_text, color_nodes_value, color_edges_value, graph_data):

    ~/anaconda3/envs/python3/lib/python3.6/site-packages/dash/dash.py in callback(self, *_args, **_kwargs) 1138 self.config.prevent_initial_callbacks, 1139 *_args, -> 1140 **_kwargs, 1141 ) 1142

    ~/anaconda3/envs/python3/lib/python3.6/site-packages/dash/_callback.py in register_callback(callback_list, callback_map, config_prevent_initial_callbacks, *_args, **_kwargs) 114 inputs_state_indices, 115 prevent_initial_call, --> 116 ) = handle_grouped_callback_args(_args, _kwargs) 117 if isinstance(output, Output): 118 # Insert callback with scalar (non-multi) Output

    ~/anaconda3/envs/python3/lib/python3.6/site-packages/dash/dependencies.py in handle_grouped_callback_args(args, kwargs) 312 outputs = outputs[0] 313 --> 314 inputs_state = extract_grouped_input_state_callback_args(flat_args, kwargs) 315 flat_inputs, flat_state, input_state_indices = compute_input_state_grouping_indices( 316 inputs_state

    ~/anaconda3/envs/python3/lib/python3.6/site-packages/dash/dependencies.py in extract_grouped_input_state_callback_args(args, kwargs) 255 # Not valid to provide state as kwarg without input as kwarg 256 raise ValueError( --> 257 "The state keyword argument may not be provided without " 258 "the input keyword argument" 259 )

    ValueError: The state keyword argument may not be provided without the input keyword argument

    opened by MSOANCAH 1
  • The state keyword argument may not be provided without the input keyword argument

    The state keyword argument may not be provided without the input keyword argument

    Trying to run this on a vanilla python 3.9 project through PyCharm.

    (pip) installed jall through PyCharm interface, it loaded correctly with all listed dependencies.

    Copied sample code in main.py: # import from jaal import Jaal from jaal.datasets import load_got # load the data edge_df, node_df = load_got() # init Jaal and run server Jaal(edge_df, node_df).plot()

    When running, got a bunch of warning about deprecated imports from dash, plus the following error output/error: \venv\Scripts\python.exe /main.py

    Parsing the data...Done
    Traceback (most recent call last):
      File "C:\Users\fdion\PycharmProjects\pythonProject1\main.py", line 24, in <module>
        Jaal(edge_df, node_df).plot()
      File "C:\Users\fdion\PycharmProjects\pythonProject1\venv\lib\site-packages\jaal\jaal.py", line 343, in plot
        app = self.create(directed=directed, vis_opts=vis_opts)
      File "C:\Users\fdion\PycharmProjects\pythonProject1\venv\lib\site-packages\jaal\jaal.py", line 272, in create
        @app.callback(
      File "C:\Users\fdion\PycharmProjects\pythonProject1\venv\lib\site-packages\dash\dash.py", line 1011, in callback
        return _callback.register_callback(
      File "C:\Users\fdion\PycharmProjects\pythonProject1\venv\lib\site-packages\dash\_callback.py", line 116, in register_callback
        ) = handle_grouped_callback_args(_args, _kwargs)
      File "C:\Users\fdion\PycharmProjects\pythonProject1\venv\lib\site-packages\dash\dependencies.py", line 308, in handle_grouped_callback_args
        inputs_state = extract_grouped_input_state_callback_args(flat_args, kwargs)
      File "C:\Users\fdion\PycharmProjects\pythonProject1\venv\lib\site-packages\dash\dependencies.py", line 250, in extract_grouped_input_state_callback_args
        raise ValueError(
    ValueError: The state keyword argument may not be provided without the input keyword argument
    
    Process finished with exit code 1
    

    I fixed the deprecated imports following the instructions in the warnings, but the "state keyword argument" issue is still there. Not sure how to proceed from here. Thanks.

    opened by francis-dion 1
  • Allow the user to pass in visdcc.Network options.

    Allow the user to pass in visdcc.Network options.

    Use the existing options as a default, but allow the user to update the options map for more customizability.

    Tested like so:

    # import
    from jaal import Jaal
    from jaal.datasets import load_got
    # load the data
    edge_df, node_df = load_got()
    # init Jaal and run server
    Jaal(edge_df, node_df).plot(vis_opts={'height': '1000px'})
    
    opened by Olshansk 1
  • Jaal not working due to dash_bootstrap_components bump!

    Jaal not working due to dash_bootstrap_components bump!

    On running the 0.1.1 version of Jaal, we get following error message,

    AttributeError: FormGroup was deprecated in dash-bootstrap-components version 1.0.0. You are using 1.0.1. For more details please see the migration guide: https://dash-bootstrap-components.opensource.faculty.ai/migration-guide/
    

    Potential solution is to put make sure to use older version in python package requirements (dash-bootstrap-components<1)

    opened by imohitmayank 0
  • Allow vis_opt on node/edge level

    Allow vis_opt on node/edge level

    Currently one cannot set the node shape and size as well as the edge color, neither on a global nor on a local (For each node/edge) scale.

    This PR moves the defined properties away from the element level and sets it as a global option, allowing the user to overwrite all node/edge configurations based on the dataframe column names.

    opened by Sebastian-Jung 0
  • Add a Gitter chat badge to README.md

    Add a Gitter chat badge to README.md

    imohitmayank/jaal now has a Chat Room on Gitter

    @imohitmayank has just created a chat room. You can visit it here: https://gitter.im/imm-jaal/community.

    This pull-request adds this badge to your README.md:

    Gitter

    If my aim is a little off, please let me know.

    Happy chatting.

    PS: Click here if you would prefer not to receive automatic pull-requests from Gitter in future.

    opened by gitter-badger 0
  • Graph taking a lot of time to plot

    Graph taking a lot of time to plot

    Using medium-sized datasets (approx 1500 edges), the time to plot the graph is exceeding 30 mins. Need to test the app on some medium-sized datasets and fix.

    bug 
    opened by imohitmayank 0
  • Images as Nodes

    Images as Nodes

    It would be useful for me to be able to use images (stored as .png files) as nodes - is it possible to do this by adding an attribute to the node properties? Ideally, the node shape and size would be retained but instead of a solid color fill the node would contain the image.

    enhancement 
    opened by ShairozS 1
  • How i can use  jaal with flask

    How i can use jaal with flask

    I am building application on flask for network visualization .I want to integrate jaal to my web app .Is there any way to achieve this .As jaal is using dash i know we can integrate dash with flask but for jaal i dont understand the way .if you can provide me any sample so i can do it

    opened by mozillah 0
  • JAAL not plotting graphs when a pair of nodes have more than one edge

    JAAL not plotting graphs when a pair of nodes have more than one edge

    Fantastic library you have made available Mayank..

    One little problem.

    If you need to plot more than one edge for a pair of nodes, the graph simply is not rendered ...

    CASE A: This works A---->B A---->C

    CASE B: This does not work. And it does not show any error. A<----B A---->B

    I have added the directed=True option...
    It does work for case A.

    Case B does not work at all.

    Any option that I may be missing ?

    Thanks in advance

    opened by marcello-moreira 1
  • Filter by the Content of a Column

    Filter by the Content of a Column

    The most important thing first: Great work thank you very much!

    Is it possible to define a filter with the content of a column?

    Description of the problem: I have an edge CSV file with three columns: from, to, group. I have no CSV for the nodes.

    Different groups of edges are defined in the Group column. The idea is to use these groups as a filter selection list. Then the user could simply filter via this selection list. Just as he can select the group under "Color edges by". So actually exactly what comes as "Edge legends" list.

    Improvement for "Filter on edges properties": If I enter the following Filter group=='Network internal' unfortunately all nodes not belonging to the group continue to be displayed and only the connections are removed. Here it would be desirable if these stand-alone nodes were also removed.

    opened by Donsen64 1
  • Pipe/stream compatibility

    Pipe/stream compatibility

    Hi, I'm looking for interactive visualization of (potentially infinite) "streaming data" (imagine a unix pipe) which can "come & go" any time. Currently it seems this is not easily possible with Jaal.

    My question is whether you'd consider supporting this.

    Thanks!

    opened by dumblob 0
Releases(v0.1.3)
Owner
Mohit
Data Scientist :smile: , Technologist, ML enthusiast, programmer and budding guitarist 🎸
Mohit
training script for space time memory network

Trainig Script for Space Time Memory Network This codebase implemented training code for Space Time Memory Network with some cyclic features. Requirem

Yuxi Li 100 Dec 20, 2022
Active window border replacement for window managers.

xborder Active window border replacement for window managers. Usage git clone https://github.com/deter0/xborder cd xborder chmod +x xborders ./xborder

deter 250 Dec 30, 2022
Short and long time series classification using convolutional neural networks

time-series-classification Short and long time series classification via convolutional neural networks In this project, we present a novel framework f

35 Oct 22, 2022
A Closer Look at Invalid Action Masking in Policy Gradient Algorithms

A Closer Look at Invalid Action Masking in Policy Gradient Algorithms This repo contains the source code to reproduce the results in the paper A Close

Costa Huang 73 Dec 24, 2022
This is a simple backtesting framework to help you test your crypto currency trading. It includes a way to download and store historical crypto data and to execute a trading strategy.

You can use this simple crypto backtesting script to ensure your trading strategy is successful Minimal setup required and works well with static TP a

Andrei 154 Sep 12, 2022
Towards Open-World Feature Extrapolation: An Inductive Graph Learning Approach

This repository holds the implementation for paper Towards Open-World Feature Extrapolation: An Inductive Graph Learning Approach Download our preproc

Qitian Wu 42 Dec 27, 2022
The codebase for Data-driven general-purpose voice activity detection.

Data driven GPVAD Repository for the work in TASLP 2021 Voice activity detection in the wild: A data-driven approach using teacher-student training. S

Heinrich Dinkel 75 Nov 27, 2022
Soft actor-critic is a deep reinforcement learning framework for training maximum entropy policies in continuous domains.

This repository is no longer maintained. Please use our new Softlearning package instead. Soft Actor-Critic Soft actor-critic is a deep reinforcement

Tuomas Haarnoja 752 Jan 07, 2023
Latent Execution for Neural Program Synthesis

Latent Execution for Neural Program Synthesis This repo provides the code to replicate the experiments in the paper Xinyun Chen, Dawn Song, Yuandong T

Xinyun Chen 16 Oct 02, 2022
Python inverse kinematics for your robot model based on Pinocchio.

Python inverse kinematics for your robot model based on Pinocchio.

Stéphane Caron 50 Dec 22, 2022
Implementation of Change-Based Exploration Transfer (C-BET)

Implementation of Change-Based Exploration Transfer (C-BET), as presented in Interesting Object, Curious Agent: Learning Task-Agnostic Exploration.

Simone Parisi 29 Dec 04, 2022
Llvlir - Low Level Variable Length Intermediate Representation

Low Level Variable Length Intermediate Representation Low Level Variable Length

Michael Clark 2 Jan 24, 2022
Grow Function: Generate 3D Stacked Bifurcating Double Deep Cellular Automata based organisms which differentiate using a Genetic Algorithm...

Grow Function: A 3D Stacked Bifurcating Double Deep Cellular Automata which differentiates using a Genetic Algorithm... TLDR;High Def Trees that you can mint as NFTs on Solana

Nathaniel Gibson 4 Oct 08, 2022
LERP : Label-dependent and event-guided interpretable disease risk prediction using EHRs

LERP : Label-dependent and event-guided interpretable disease risk prediction using EHRs This is the code for the LERP. Dataset The dataset used is MI

5 Jun 18, 2022
Minimal PyTorch implementation of Generative Latent Optimization from the paper "Optimizing the Latent Space of Generative Networks"

Minimal PyTorch implementation of Generative Latent Optimization This is a reimplementation of the paper Piotr Bojanowski, Armand Joulin, David Lopez-

Thomas Neumann 117 Nov 27, 2022
Coarse implement of the paper "A Simultaneous Denoising and Dereverberation Framework with Target Decoupling", On DNS-2020 dataset, the DNSMOS of first stage is 3.42 and second stage is 3.47.

SDDNet Coarse implement of the paper "A Simultaneous Denoising and Dereverberation Framework with Target Decoupling", On DNS-2020 dataset, the DNSMOS

Cyril Lv 43 Nov 21, 2022
The 7th edition of NTIRE: New Trends in Image Restoration and Enhancement workshop will be held on June 2022 in conjunction with CVPR 2022.

NTIRE 2022 - Image Inpainting Challenge Important dates 2022.02.01: Release of train data (input and output images) and validation data (only input) 2

Andrés Romero 37 Nov 27, 2022
CausalNLP is a practical toolkit for causal inference with text as treatment, outcome, or "controlled-for" variable.

CausalNLP CausalNLP is a practical toolkit for causal inference with text as treatment, outcome, or "controlled-for" variable. Install pip install -U

Arun S. Maiya 95 Jan 03, 2023
[CVPR2021] Look before you leap: learning landmark features for one-stage visual grounding.

LBYL-Net This repo implements paper Look Before You Leap: Learning Landmark Features For One-Stage Visual Grounding CVPR 2021. Getting Started Prerequ

SVIP Lab 45 Dec 12, 2022
TipToiDog - Tip Toi Dog With Python

TipToiDog Was ist dieses Projekt? Meine 5-jährige Tochter spielt sehr gerne das

1 Feb 07, 2022