Your interactive network visualizing dashboard

Related tags

Deep Learning jaal
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
Simple tools for logging and visualizing, loading and training

TNT TNT is a library providing powerful dataloading, logging and visualization utilities for Python. It is closely integrated with PyTorch and is desi

null 1.5k Jan 2, 2023
A module for solving and visualizing Schrödinger equation.

qmsolve This is an attempt at making a solid, easy to use solver, capable of solving and visualize the Schrödinger equation for multiple particles, an

null 506 Dec 28, 2022
Code for CVPR2021 "Visualizing Adapted Knowledge in Domain Transfer". Visualization for domain adaptation. #explainable-ai

Visualizing Adapted Knowledge in Domain Transfer @inproceedings{hou2021visualizing, title={Visualizing Adapted Knowledge in Domain Transfer}, auth

Yunzhong Hou 80 Dec 25, 2022
Code for visualizing the loss landscape of neural nets

Visualizing the Loss Landscape of Neural Nets This repository contains the PyTorch code for the paper Hao Li, Zheng Xu, Gavin Taylor, Christoph Studer

Tom Goldstein 2.2k Jan 9, 2023
Improving Contrastive Learning by Visualizing Feature Transformation, ICCV 2021 Oral

Improving Contrastive Learning by Visualizing Feature Transformation This project hosts the codes, models and visualization tools for the paper: Impro

Bingchen Zhao 83 Dec 15, 2022
Streamlit Tutorial (ex: stock price dashboard, cartoon-stylegan, vqgan-clip, stylemixing, styleclip, sefa)

Streamlit Tutorials Install pip install streamlit Run cd [directory] streamlit run app.py --server.address 0.0.0.0 --server.port [your port] # http:/

Jihye Back 30 Jan 6, 2023
Only works with the dashboard version / branch of jesse

Jesse optuna Only works with the dashboard version / branch of jesse. The config.yml should be self-explainatory. Installation # install from git pip

Markus K. 8 Dec 4, 2022
The most simple and minimalistic navigation dashboard.

Navigation This project follows a goal to have simple and lightweight dashboard with different links. I use it to have my own self-hosted service dash

Yaroslav 23 Dec 23, 2022
Vowpal Wabbit is a machine learning system which pushes the frontier of machine learning with techniques such as online, hashing, allreduce, reductions, learning2search, active, and interactive learning.

This is the Vowpal Wabbit fast online learning code. Why Vowpal Wabbit? Vowpal Wabbit is a machine learning system which pushes the frontier of machin

Vowpal Wabbit 8.1k Jan 6, 2023
Reviving Iterative Training with Mask Guidance for Interactive Segmentation

This repository provides the source code for training and testing state-of-the-art click-based interactive segmentation models with the official PyTorch implementation

Visual Understanding Lab @ Samsung AI Center Moscow 406 Jan 1, 2023
[CVPR 2021] Anycost GANs for Interactive Image Synthesis and Editing

Anycost GAN video | paper | website Anycost GANs for Interactive Image Synthesis and Editing Ji Lin, Richard Zhang, Frieder Ganz, Song Han, Jun-Yan Zh

MIT HAN Lab 726 Dec 28, 2022
Open source code for Paper "A Co-Interactive Transformer for Joint Slot Filling and Intent Detection"

A Co-Interactive Transformer for Joint Slot Filling and Intent Detection This repository contains the PyTorch implementation of the paper: A Co-Intera

null 67 Dec 5, 2022
[CVPR 2021] Modular Interactive Video Object Segmentation: Interaction-to-Mask, Propagation and Difference-Aware Fusion

[CVPR 2021] Modular Interactive Video Object Segmentation: Interaction-to-Mask, Propagation and Difference-Aware Fusion

Rex Cheng 364 Jan 3, 2023
[CVPR'21] Learning to Recommend Frame for Interactive Video Object Segmentation in the Wild

IVOS-W Paper Learning to Recommend Frame for Interactive Video Object Segmentation in the Wild Zhaoyun Yin, Jia Zheng, Weixin Luo, Shenhan Qian, Hanli

SVIP Lab 38 Dec 12, 2022
Image transformations designed for Scene Text Recognition (STR) data augmentation. Published at ICCV 2021 Workshop on Interactive Labeling and Data Augmentation for Vision.

Data Augmentation for Scene Text Recognition (ICCV 2021 Workshop) (Pronounced as "strog") Paper Arxiv Why it matters? Scene Text Recognition (STR) req

Rowel Atienza 152 Dec 28, 2022
ONNX Runtime Web demo is an interactive demo portal showing real use cases running ONNX Runtime Web in VueJS.

ONNX Runtime Web demo is an interactive demo portal showing real use cases running ONNX Runtime Web in VueJS. It currently supports four examples for you to quickly experience the power of ONNX Runtime Web.

Microsoft 58 Dec 18, 2022
Seeing if I can put together an interactive version of 3b1b's Manim in Streamlit

streamlit-manim Seeing if I can put together an interactive version of 3b1b's Manim in Streamlit Installation I had to install pango with sudo apt-get

Adrien Treuille 6 Aug 3, 2022
Implementation for the EMNLP 2021 paper "Interactive Machine Comprehension with Dynamic Knowledge Graphs".

Interactive Machine Comprehension with Dynamic Knowledge Graphs Implementation for the EMNLP 2021 paper. Dependencies apt-get -y update apt-get instal

Xingdi (Eric) Yuan 19 Aug 23, 2022
[MedIA2021]MIDeepSeg: Minimally Interactive Segmentation of Unseen Objects from Medical Images Using Deep Learning

MIDeepSeg: Minimally Interactive Segmentation of Unseen Objects from Medical Images Using Deep Learning [MedIA or Arxiv] and [Demo] This repository pr

Healthcare Intelligence Laboratory 92 Dec 8, 2022