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
Layered Neural Atlases for Consistent Video Editing

Layered Neural Atlases for Consistent Video Editing Project Page | Paper This repository contains an implementation for the SIGGRAPH Asia 2021 paper L

Yoni Kasten 353 Dec 27, 2022
Tensorflow implementation of "Learning Deep Features for Discriminative Localization"

Weakly_detector Tensorflow implementation of "Learning Deep Features for Discriminative Localization" B. Zhou, A. Khosla, A. Lapedriza, A. Oliva, and

Taeksoo Kim 363 Jun 29, 2022
Instance Semantic Segmentation List

Instance Semantic Segmentation List This repository contains lists of state-or-art instance semantic segmentation works. Papers and resources are list

bighead 87 Mar 06, 2022
Meshed-Memory Transformer for Image Captioning. CVPR 2020

M²: Meshed-Memory Transformer This repository contains the reference code for the paper Meshed-Memory Transformer for Image Captioning (CVPR 2020). Pl

AImageLab 422 Dec 28, 2022
Out-of-distribution detection using the pNML regret. NeurIPS2021

OOD Detection Load conda environment conda env create -f environment.yml or install requirements: while read requirement; do conda install --yes $requ

Koby Bibas 23 Dec 02, 2022
Attentional Focus Modulates Automatic Finger‑tapping Movements

"Attentional Focus Modulates Automatic Finger‑tapping Movements", in Scientific Reports

Xingxun Jiang 1 Dec 02, 2021
AI grand challenge 2020 Repo (Speech Recognition Track)

KorBERT를 활용한 한국어 텍스트 기반 위협 상황인지(2020 인공지능 그랜드 챌린지) 본 프로젝트는 ETRI에서 제공된 한국어 korBERT 모델을 활용하여 폭력 기반 한국어 텍스트를 분류하는 다양한 분류 모델들을 제공합니다. 본 개발자들이 참여한 2020 인공지

Young-Seok Choi 23 Jan 25, 2022
The official implementation of our CVPR 2021 paper - Hybrid Rotation Averaging: A Fast and Robust Rotation Averaging Approach

Graph Optimizer This repo contains the official implementation of our CVPR 2021 paper - Hybrid Rotation Averaging: A Fast and Robust Rotation Averagin

Chenyu 109 Dec 23, 2022
Source code for From Stars to Subgraphs

GNNAsKernel Official code for From Stars to Subgraphs: Uplifting Any GNN with Local Structure Awareness Visualizations GNN-AK(+) GNN-AK(+) with Subgra

44 Dec 19, 2022
Learning to Segment Instances in Videos with Spatial Propagation Network

Learning to Segment Instances in Videos with Spatial Propagation Network This paper is available at the 2017 DAVIS Challenge website. Check our result

Jingchun Cheng 145 Sep 28, 2022
SweiNet is an uncertainty-quantifying shear wave speed (SWS) estimator for ultrasound shear wave elasticity (SWE) imaging.

SweiNet SweiNet is an uncertainty-quantifying shear wave speed (SWS) estimator for ultrasound shear wave elasticity (SWE) imaging. SweiNet takes as in

Felix Jin 3 Mar 31, 2022
A simple library that implements CLIP guided loss in PyTorch.

pytorch_clip_guided_loss: Pytorch implementation of the CLIP guided loss for Text-To-Image, Image-To-Image, or Image-To-Text generation. A simple libr

Sergei Belousov 74 Dec 26, 2022
Official implementation of the paper Do pedestrians pay attention? Eye contact detection for autonomous driving

Do pedestrians pay attention? Eye contact detection for autonomous driving Official implementation of the paper Do pedestrians pay attention? Eye cont

VITA lab at EPFL 26 Nov 02, 2022
Robustness between the worst and average case

Robustness between the worst and average case A repository that implements intermediate robustness training and evaluation from the NeurIPS 2021 paper

CMU Locus Lab 16 Dec 02, 2022
Deep ViT Features as Dense Visual Descriptors

dino-vit-features [paper] [project page] Official implementation of the paper "Deep ViT Features as Dense Visual Descriptors". We demonstrate the effe

Shir Amir 113 Dec 24, 2022
Using Self-Supervised Pretext Tasks for Active Learning - Official Pytorch Implementation

Using Self-Supervised Pretext Tasks for Active Learning - Official Pytorch Implementation Experiment Setting: CIFAR10 (downloaded and saved in ./DATA

John Seon Keun Yi 38 Dec 27, 2022
Behavioral "black-box" testing for recommender systems

RecList RecList Free software: MIT license Documentation: https://reclist.readthedocs.io. Overview RecList is an open source library providing behavio

Jacopo Tagliabue 375 Dec 30, 2022
Compartmental epidemic model to assess undocumented infections: applications to SARS-CoV-2 epidemics in Brazil - Datasets and Codes

Compartmental epidemic model to assess undocumented infections: applications to SARS-CoV-2 epidemics in Brazil - Datasets and Codes The codes for simu

1 Jan 12, 2022
CPPE - 5 (Medical Personal Protective Equipment) is a new challenging object detection dataset

CPPE - 5 CPPE - 5 (Medical Personal Protective Equipment) is a new challenging dataset with the goal to allow the study of subordinate categorization

Rishit Dagli 53 Dec 17, 2022
A collection of differentiable SVD methods and also the official implementation of the ICCV21 paper "Why Approximate Matrix Square Root Outperforms Accurate SVD in Global Covariance Pooling?"

Differentiable SVD Introduction This repository contains: The official Pytorch implementation of ICCV21 paper Why Approximate Matrix Square Root Outpe

YueSong 32 Dec 25, 2022