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
EqGAN - Improving GAN Equilibrium by Raising Spatial Awareness

EqGAN - Improving GAN Equilibrium by Raising Spatial Awareness Improving GAN Equilibrium by Raising Spatial Awareness Jianyuan Wang, Ceyuan Yang, Ying

GenForce: May Generative Force Be with You 149 Dec 19, 2022
Server files for UltimateLabeling

UltimateLabeling server files Server files for UltimateLabeling. git clone https://github.com/alexandre01/UltimateLabeling_server.git cd UltimateLabel

Alexandre Carlier 4 Oct 10, 2022
Custom studies about block sparse attention.

Block Sparse Attention 研究总结 本人近半年来对Block Sparse Attention(块稀疏注意力)的研究总结(持续更新中)。按时间顺序,主要分为如下三部分: PyTorch 自定义 CUDA 算子——以矩阵乘法为例 基于 Triton 的 Block Sparse A

Chen Kai 2 Jan 09, 2022
Generating retro pixel game characters with Generative Adversarial Networks. Dataset "TinyHero" included.

pixel_character_generator Generating retro pixel game characters with Generative Adversarial Networks. Dataset "TinyHero" included. Dataset TinyHero D

Agnieszka Mikołajczyk 88 Nov 17, 2022
Autonomous racing with the Anki Overdrive

Anki Autonomous Racing Autonomous racing with the Anki Overdrive. Using the Overdrive-Python API (https://github.com/xerodotc/overdrive-python) develo

3 Dec 11, 2022
SnapMix: Semantically Proportional Mixing for Augmenting Fine-grained Data (AAAI 2021)

SnapMix: Semantically Proportional Mixing for Augmenting Fine-grained Data (AAAI 2021) PyTorch implementation of SnapMix | paper Method Overview Cite

DavidHuang 126 Dec 30, 2022
git《Commonsense Knowledge Base Completion with Structural and Semantic Context》(AAAI 2020) GitHub: [fig1]

Commonsense Knowledge Base Completion with Structural and Semantic Context Code for the paper Commonsense Knowledge Base Completion with Structural an

AI2 96 Nov 05, 2022
TraND: Transferable Neighborhood Discovery for Unsupervised Cross-domain Gait Recognition.

TraND This is the code for the paper "Jinkai Zheng, Xinchen Liu, Chenggang Yan, Jiyong Zhang, Wu Liu, Xiaoping Zhang and Tao Mei: TraND: Transferable

Jinkai Zheng 32 Apr 04, 2022
Build tensorflow keras model pipelines in a single line of code. Created by Ram Seshadri. Collaborators welcome. Permission granted upon request.

deep_autoviml Build keras pipelines and models in a single line of code! Table of Contents Motivation How it works Technology Install Usage API Image

AutoViz and Auto_ViML 102 Dec 17, 2022
A denoising diffusion probabilistic model synthesises galaxies that are qualitatively and physically indistinguishable from the real thing.

Realistic galaxy simulation via score-based generative models Official code for 'Realistic galaxy simulation via score-based generative models'. We us

Michael Smith 32 Dec 20, 2022
Flybirds - BDD-driven natural language automated testing framework, present by Trip Flight

Flybird | English Version 行为驱动开发(Behavior-driven development,缩写BDD),是一种软件过程的思想或者

Ctrip, Inc. 706 Dec 30, 2022
Deep Learning Theory

Deep Learning Theory 整理了一些深度学习的理论相关内容,持续更新。 Overview Recent advances in deep learning theory 总结了目前深度学习理论研究的六个方向的一些结果,概述型,没做深入探讨(2021)。 1.1 complexity

fq 103 Jan 04, 2023
Code of the paper "Performance-Efficiency Trade-offs in Unsupervised Pre-training for Speech Recognition"

SEW (Squeezed and Efficient Wav2vec) The repo contains the code of the paper "Performance-Efficiency Trade-offs in Unsupervised Pre-training for Speec

ASAPP Research 67 Dec 01, 2022
The Pytorch code of "Joint Distribution Matters: Deep Brownian Distance Covariance for Few-Shot Classification", CVPR 2022 (Oral).

DeepBDC for few-shot learning        Introduction In this repo, we provide the implementation of the following paper: "Joint Distribution Matters: Dee

FeiLong 116 Dec 19, 2022
Self-Correcting Quantum Many-Body Control using Reinforcement Learning with Tensor Networks

Self-Correcting Quantum Many-Body Control using Reinforcement Learning with Tensor Networks This repository contains the code and data for the corresp

Friederike Metz 7 Apr 23, 2022
Keras implementation of Normalizer-Free Networks and SGD - Adaptive Gradient Clipping

Keras implementation of Normalizer-Free Networks and SGD - Adaptive Gradient Clipping

Yam Peleg 63 Sep 21, 2022
ZeroVL - The official implementation of ZeroVL

This repository contains source code necessary to reproduce the results presente

31 Nov 04, 2022
SlotRefine: A Fast Non-Autoregressive Model forJoint Intent Detection and Slot Filling

SlotRefine: A Fast Non-Autoregressive Model for Joint Intent Detection and Slot Filling Reference Main paper to be cited (Di Wu et al., 2020) @article

Moore 34 Nov 03, 2022
Revisiting Weakly Supervised Pre-Training of Visual Perception Models

SWAG: Supervised Weakly from hashtAGs This repository contains SWAG models from the paper Revisiting Weakly Supervised Pre-Training of Visual Percepti

Meta Research 134 Jan 05, 2023
code for our ECCV 2020 paper "A Balanced and Uncertainty-aware Approach for Partial Domain Adaptation"

Code for our ECCV (2020) paper A Balanced and Uncertainty-aware Approach for Partial Domain Adaptation. Prerequisites: python == 3.6.8 pytorch ==1.1.0

32 Nov 27, 2022