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
Equivariant layers for RC-complement symmetry in DNA sequence data

Equi-RC Equivariant layers for RC-complement symmetry in DNA sequence data This is a repository that implements the layers as described in "Reverse-Co

7 May 19, 2022
Repository for the paper "Online Domain Adaptation for Occupancy Mapping", RSS 2020

RSS 2020 - Online Domain Adaptation for Occupancy Mapping Repository for the paper "Online Domain Adaptation for Occupancy Mapping", Robotics: Science

Anthony 26 Sep 22, 2022
A PyTorch Image-Classification With AlexNet And ResNet50.

PyTorch 图像分类 依赖库的下载与安装 在终端中执行 pip install -r -requirements.txt 完成项目依赖库的安装 使用方式 数据集的准备 STL10 数据集 下载:STL-10 Dataset 存储位置:将下载后的数据集中 train_X.bin,train_y.b

FYH 4 Feb 22, 2022
This tutorial repository is to introduce the functionality of KGTK to first-time users

Welcome to the KGTK notebook tutorial The goal of this tutorial repository is to introduce the functionality of KGTK to first-time users. The Knowledg

USC ISI I2 58 Dec 21, 2022
This repo is the code release of EMNLP 2021 conference paper "Connect-the-Dots: Bridging Semantics between Words and Definitions via Aligning Word Sense Inventories".

Connect-the-Dots: Bridging Semantics between Words and Definitions via Aligning Word Sense Inventories This repo is the code release of EMNLP 2021 con

12 Nov 22, 2022
CNN designed for pansharpening

PROGRESSIVE BAND-SEPARATED CONVOLUTIONAL NEURAL NETWORK FOR MULTISPECTRAL PANSHARPENING This repository contains main code for the paper PROGRESSIVE B

SerendipitysX 3 Dec 29, 2021
2nd solution of ICDAR 2021 Competition on Scientific Literature Parsing, Task B.

TableMASTER-mmocr Contents About The Project Method Description Dependency Getting Started Prerequisites Installation Usage Data preprocess Train Infe

Jianquan Ye 298 Dec 21, 2022
Official Implementation of SWAGAN: A Style-based Wavelet-driven Generative Model

Official Implementation of SWAGAN: A Style-based Wavelet-driven Generative Model SWAGAN: A Style-based Wavelet-driven Generative Model Rinon Gal, Dana

55 Dec 06, 2022
This project uses Template Matching technique for object detecting by detection of template image over base image.

Object Detection Project Using OpenCV This project uses Template Matching technique for object detecting by detection the template image over base ima

Pratham Bhatnagar 7 May 29, 2022
A denoising diffusion probabilistic model (DDPM) tailored for conditional generation of protein distograms

Denoising Diffusion Probabilistic Model for Proteins Implementation of Denoising Diffusion Probabilistic Model in Pytorch. It is a new approach to gen

Phil Wang 108 Nov 23, 2022
This repository contains a PyTorch implementation of the paper Learning to Assimilate in Chaotic Dynamical Systems.

Amortized Assimilation This repository contains a PyTorch implementation of the paper Learning to Assimilate in Chaotic Dynamical Systems. Abstract: T

4 Aug 16, 2022
User-friendly bulk RNAseq deconvolution using simulated annealing

Welcome to cellanneal - The user-friendly application for deconvolving omics data sets. cellanneal is an application for deconvolving biological mixtu

11 Dec 16, 2022
DynaTune: Dynamic Tensor Program Optimization in Deep Neural Network Compilation

DynaTune: Dynamic Tensor Program Optimization in Deep Neural Network Compilation This repository is the implementation of DynaTune paper. This folder

4 Nov 02, 2022
Software Platform for solving and manipulating multiparametric programs in Python

PPOPT Python Parametric OPtimization Toolbox (PPOPT) is a software platform for solving and manipulating multiparametric programs in Python. This pack

10 Sep 13, 2022
Code for "NeuralRecon: Real-Time Coherent 3D Reconstruction from Monocular Video", CVPR 2021 oral

NeuralRecon: Real-Time Coherent 3D Reconstruction from Monocular Video Project Page | Paper NeuralRecon: Real-Time Coherent 3D Reconstruction from Mon

ZJU3DV 1.4k Dec 30, 2022
This repository contains the implementations related to the experiments of a set of publicly available datasets that are used in the time series forecasting research space.

TSForecasting This repository contains the implementations related to the experiments of a set of publicly available datasets that are used in the tim

Rakshitha Godahewa 80 Dec 30, 2022
SOLO and SOLOv2 for instance segmentation, ECCV 2020 & NeurIPS 2020.

SOLO: Segmenting Objects by Locations This project hosts the code for implementing the SOLO algorithms for instance segmentation. SOLO: Segmenting Obj

Xinlong Wang 1.5k Dec 31, 2022
Source code of "Hold me tight! Influence of discriminative features on deep network boundaries"

Hold me tight! Influence of discriminative features on deep network boundaries This is the source code to reproduce the experiments of the NeurIPS 202

EPFL LTS4 19 Dec 10, 2021
Anatomy of Matplotlib -- tutorial developed for the SciPy conference

Introduction This tutorial is a complete re-imagining of how one should teach users the matplotlib library. Hopefully, this tutorial may serve as insp

Matplotlib Developers 1.1k Dec 29, 2022
This repository contains various models targetting multimodal representation learning, multimodal fusion for downstream tasks such as multimodal sentiment analysis.

Multimodal Deep Learning 🎆 🎆 🎆 Announcing the multimodal deep learning repository that contains implementation of various deep learning-based model

Deep Cognition and Language Research (DeCLaRe) Lab 398 Dec 30, 2022