From 0c488c693e22866801ebd817d9aeef011366088d Mon Sep 17 00:00:00 2001 From: Joseph Cottam Date: Wed, 6 Sep 2023 10:30:04 -0700 Subject: [PATCH 01/16] Multi-graph special handling for 'all'. More robust simple spring-force graph. --- src/pyciemss/visuals/graphs.py | 74 +++++++++++++++++-- .../visuals/schemas/multigraph.vg.json | 10 ++- 2 files changed, 74 insertions(+), 10 deletions(-) diff --git a/src/pyciemss/visuals/graphs.py b/src/pyciemss/visuals/graphs.py index b152753af..bed671eb4 100644 --- a/src/pyciemss/visuals/graphs.py +++ b/src/pyciemss/visuals/graphs.py @@ -1,14 +1,15 @@ from typing import Union import networkx as nx -from . import vega +import vega -def attributed_graph(graph: nx.Graph) -> vega.VegaSchema: +def attributed_graph( + graph: nx.Graph, *, collapse_all: bool = False, node_labels: Union[str, None] = None +) -> vega.VegaSchema: """Draw a graph with node/edge attributions color-coded. graph (networkx graph): A networkX graph with attributes on nodes/edges as follows. - label -- Node attribute used to label the nodes. Can be anything that vega can interpret as a string. attribution -- Node attribute. List of values used to color portions of the node border. attribution -- Edge attribute. list of values used to color the edge. @@ -16,25 +17,82 @@ def attributed_graph(graph: nx.Graph) -> vega.VegaSchema: NOTE: Other properties will be propogated through. TODO: Make layout in the vega schema optional (accept passed- in schemas) - TODO: Add interaction to the vega schema The color coding of attribution will be shared between nodes and edges. + + node_labels + Node labels will be constructed as follows: + -- If node_labels is None, the node-id will be used + -- If node_labels is not "label", the attribute specified will be copied into a "label" attribute + collapse_all: If True AND an attribution includes all of the attributions used, + the attribution will be set to just "*all*". This can be used to + simplify the visualization in some cases. """ + + if node_labels is None: + graph = nx.convert_node_labels_to_integers(graph, label_attribute="label") + elif node_labels == "label": + nx.set_node_attributes( + graph, nx.get_node_attributes(graph, node_labels), "label" + ) + gjson = nx.json_graph.node_link_data(graph) + possible_attributions = set() for n in gjson["nodes"]: if "attribution" not in n or len(n["attribution"]) == 0: raise ValueError( - "Every node must have an 'attribution' property with at least one element in the list." + f"Every node must have an 'attribution' property with at least one element in the list. Failed for {n}" ) + possible_attributions.update(n["attribution"]) for e in gjson["links"]: - if "attribution" not in n or len(n["attribution"]) == 0: + if "attribution" not in e or len(e["attribution"]) == 0: raise ValueError( - "Every edge must have an 'attribution' property with at least one element in the list." + f"Every edge must have an 'attribution' property with at least one element in the list. Failed for {e}" ) + possible_attributions.update(n["attribution"]) schema = vega.load_schema("multigraph.vg.json") + if collapse_all: + # This is category20, but with the light-gray moved up and the dark-gray removed + colormap = [ + "#c7c7c7", + "#1f77b4", + "#aec7e8", + "#ff7f0e", + "#ffbb78", + "#2ca02c", + "#98df8a", + "#d62728", + "#ff9896", + "#9467bd", + "#c5b0d5", + "#8c564b", + "#c49c94", + "#e377c2", + "#f7b6d2", + "#bcbd22", + "#dbdb8d", + "#17becf", + "#9edae5", + ] + did_replace = False + for n in gjson["nodes"]: + if len(possible_attributions.difference(n["attribution"])) == 0: + n["attribution"] = ["*all*"] + did_replace = True + + for e in gjson["links"]: + if len(possible_attributions.difference(e["attribution"])) == 0: + e["attribution"] = ["*all*"] + did_replace = True + + if did_replace: + schema["scales"] = vega.replace_named_with( + schema["scales"], "color", ["range"], colormap + ) + schema["data"] = vega.replace_named_with( schema["data"], "node-data", ["values"], gjson["nodes"] ) @@ -54,6 +112,8 @@ def spring_force_graph( labels -- If it is a string, that field name is used ('label' is the default; 'id' will give the networkx node-id). If it is None, no label is drawn. """ + graph = nx.convert_node_labels_to_integers(graph, label_attribute=node_labels) + gjson = nx.json_graph.node_link_data(graph) schema = vega.load_schema("spring_graph.vg.json") diff --git a/src/pyciemss/visuals/schemas/multigraph.vg.json b/src/pyciemss/visuals/schemas/multigraph.vg.json index ed57e2de1..44344cd05 100644 --- a/src/pyciemss/visuals/schemas/multigraph.vg.json +++ b/src/pyciemss/visuals/schemas/multigraph.vg.json @@ -58,7 +58,8 @@ "type": "ordinal", "range": {"scheme": "category20"}, "domain": { - "fields": [ + "sort": {"order": "ascending"}, + "fields": [ {"data": "node-attributions", "field": "attribution"}, {"data": "link-attributions", "field": "attribution"} ] @@ -222,14 +223,17 @@ "from": {"data": "nodes"}, "encode": { "enter": { - "fill": {"value": "black"}, "text": {"field": "datum.label"}, "align": {"value": "center"}, "baseline": {"value": "middle"} }, "update": { "x": {"field": "x"}, - "y": {"field": "y"} + "y": {"field": "y"}, + "fill": [ + {"test": "indexof(datum.datum.attribution, '*all*')>=0", "value": "lightgray"}, + {"value": "gray"} + ] } } } From e6c1546bc1709064ccec226cd7f58687d42791e1 Mon Sep 17 00:00:00 2001 From: "Oostrom, Marjolein T" Date: Wed, 6 Sep 2023 13:04:14 -0700 Subject: [PATCH 02/16] set layout in graph --- notebook/visual examples/Graphs.ipynb | 240 +++++++--- src/pyciemss/visuals/graphs.py | 9 +- .../visuals/schemas/spring_graph.vg.json | 416 ++++++++++-------- 3 files changed, 437 insertions(+), 228 deletions(-) diff --git a/notebook/visual examples/Graphs.ipynb b/notebook/visual examples/Graphs.ipynb index 8430f37f7..0a7fc7ec8 100644 --- a/notebook/visual examples/Graphs.ipynb +++ b/notebook/visual examples/Graphs.ipynb @@ -2,19 +2,10 @@ "cells": [ { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, "id": "a1299176", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], + "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2" @@ -22,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 2, "id": "5c1729f7-1b0d-4913-8048-01624c506cc5", "metadata": {}, "outputs": [], @@ -33,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 3, "id": "997ef041-0312-4b83-bbe2-32a6ddfe3d6c", "metadata": {}, "outputs": [], @@ -43,18 +34,18 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 4, "id": "a4b1668c", "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] }, - "execution_count": 9, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -86,8 +77,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "id": "e0d2ada7", + "execution_count": 6, + "id": "ece8d8e5", "metadata": {}, "outputs": [ { @@ -106,22 +97,37 @@ "name": "node-data", "values": [ { + "fx": 97, + "fy": 72, + "group": "W", "id": 0, "label": "n0" }, { + "fx": 37, + "fy": 3, + "group": "X", "id": 1, "label": "n1" }, { + "fx": 71, + "fy": 39, + "group": "W", "id": 2, "label": "n2" }, { + "fx": 3, + "fy": 35, + "group": "X", "id": 3, "label": "n3" }, { + "fx": 48, + "fy": 71, + "group": "U", "id": 4, "label": "n4" } @@ -131,39 +137,50 @@ "name": "link-data", "values": [ { + "group": "Y", "source": 0, "target": 1 }, { + "group": "Z", "source": 0, "target": 2 }, { + "group": "Z", "source": 0, "target": 3 }, { + "group": "W", "source": 0, "target": 4 }, { + "group": "Z", "source": 1, "target": 4 }, { - "source": 3, + "group": "W", + "source": 2, "target": 4 } ] } ], "description": "A node-link diagram with force-directed layout.", - "height": 300, + "height": 500, "legends": [ { "stroke": "color", "symbolType": "stroke", "title": "Group" + }, + { + "stroke": "colorlink", + "symbolType": "stroke", + "title": "Link Group" } ], "marks": [ @@ -172,7 +189,7 @@ "enter": { "fill": { "field": "group", - "scale": "color" + "value": "color" }, "stroke": { "value": "white" @@ -182,6 +199,12 @@ "cursor": { "value": "pointer" }, + "fx": { + "signal": "node != null && node.datum.id == datum.id && fix.length == 2 ? fix[0] : (layoutdata ? scale('xscale', datum.fx) : null)" + }, + "fy": { + "signal": "node != null && node.datum.id == datum.id && fix.length == 2 ? fix[1] : (layoutdata ? scale('yscale', datum.fy) : null)" + }, "size": { "signal": "2 * nodeRadius * nodeRadius" } @@ -191,18 +214,6 @@ "data": "node-data" }, "name": "nodes", - "on": [ - { - "modify": "node", - "trigger": "fix", - "values": "fix === true ? {fx: node.x, fy: node.y} : {fx: fix[0], fy: fix[1]}" - }, - { - "modify": "node", - "trigger": "!fix", - "values": "{fx: null, fy: null}" - } - ], "transform": [ { "forces": [ @@ -240,9 +251,7 @@ "signal": "restart" }, "signal": "force", - "static": { - "signal": "static" - }, + "static": true, "type": "force" } ], @@ -262,7 +271,7 @@ "value": "black" }, "fontSize": { - "value": 15 + "value": 10 }, "text": { "field": "datum.label" @@ -284,9 +293,22 @@ "name": "labels", "transform": [ { - "as": "y", - "expr": "datum.y", - "type": "formula" + "anchor": [ + "top", + "bottom", + "right", + "left" + ], + "avoidMarks": [ + "nodes" + ], + "offset": [ + 1 + ], + "size": { + "signal": "[width + 60, height]" + }, + "type": "label" } ], "type": "text", @@ -296,7 +318,8 @@ "encode": { "update": { "stroke": { - "value": "#ccc" + "field": "group", + "scale": "colorlink" }, "strokeWidth": { "value": 0.5 @@ -321,6 +344,69 @@ } ], "type": "path" + }, + { + "encode": { + "enter": { + "fill": { + "field": "group", + "scale": "colorlink" + }, + "shape": { + "value": "triangle-right" + }, + "size": { + "value": 40 + }, + "stroke": { + "field": "group", + "scale": "colorlink" + } + }, + "hover": { + "opacity": { + "value": 1 + } + }, + "update": { + "x": { + "field": "target.x" + }, + "y": { + "field": "target.y" + } + } + }, + "from": { + "data": "link-data" + }, + "name": "arrows", + "transform": [ + { + "as": "tan", + "expr": "atan2((datum.datum.target.y-datum.datum.source.y),(datum.datum.target.x-datum.datum.source.x))", + "type": "formula" + }, + { + "as": "angle", + "expr": "datum.tan*180/PI", + "type": "formula" + }, + { + "as": "y", + "expr": "datum.datum.target.y - nodeRadius*sin(datum.tan)", + "type": "formula" + }, + { + "as": "x", + "expr": "datum.datum.target.x - nodeRadius*cos(datum.tan)", + "type": "formula" + } + ], + "type": "symbol", + "zindex": { + "value": 40 + } } ], "padding": 0, @@ -335,6 +421,43 @@ "scheme": "category20c" }, "type": "ordinal" + }, + { + "domain": { + "data": "link-data", + "field": "group" + }, + "name": "colorlink", + "range": { + "scheme": "category20c" + }, + "type": "ordinal" + }, + { + "domain": { + "data": "node-data", + "field": "fx" + }, + "name": "xscale", + "range": [ + 10, + { + "signal": "width - 10" + } + ] + }, + { + "domain": { + "data": "node-data", + "field": "fy" + }, + "name": "yscale", + "range": [ + 10, + { + "signal": "height - 10" + } + ] } ], "signals": [ @@ -362,7 +485,7 @@ "bind": { "input": "checkbox" }, - "name": "static", + "name": "layoutdata", "value": true }, { @@ -405,12 +528,18 @@ "signal": "fix" }, "update": "fix && fix.length" + }, + { + "events": { + "signal": "layoutdata" + }, + "update": "true" } ], "value": false } ], - "width": 300 + "width": 500 } }, "metadata": {}, @@ -419,19 +548,26 @@ ], "source": [ "g = nx.generators.barabasi_albert_graph(5, 3)\n", + "def rand_group():\n", + " possible = \"TUVWXYZ\"\n", + " return random.sample(possible, 1)[0]\n", + "\n", + "node_properties = {n: {\"group\": rand_group(), \n", + " \"fx\": random.randint(1, 100),\n", + " \"fy\": random.randint(1, 100)}\n", + " for n in g.nodes()}\n", + "\n", + "edge_attributions = {e: {\"group\": rand_group()}\n", + " for e in g.edges()}\n", + "\n", + "nx.set_node_attributes(g, node_properties)\n", + "nx.set_edge_attributes(g, edge_attributions)\n", "nx.set_node_attributes(g, {k:f\"n{i}\" for i, k in enumerate(g.nodes)}, \"label\")\n", + "\n", "schema = plots.spring_force_graph(g, node_labels=\"label\")\n", "plots.save_schema(schema, \"_schema.json\")\n", "plots.ipy_display(schema, format=\"interactive\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ece8d8e5", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -450,7 +586,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.10.11" } }, "nbformat": 4, diff --git a/src/pyciemss/visuals/graphs.py b/src/pyciemss/visuals/graphs.py index bed671eb4..3ad5c756a 100644 --- a/src/pyciemss/visuals/graphs.py +++ b/src/pyciemss/visuals/graphs.py @@ -104,7 +104,9 @@ def attributed_graph( def spring_force_graph( - graph: nx.Graph, node_labels: Union[str, None] = "label" + graph: nx.Graph, + node_labels: Union[str, None] = "label", + directed_graph: bool = True ) -> vega.VegaSchema: """Draw a general spring-force graph @@ -131,4 +133,7 @@ def spring_force_graph( labels = vega.find_named(schema["marks"], "labels") labels["encode"]["enter"]["text"]["field"] = f"datum.{node_labels}" - return schema + if not directed_graph: + schema["marks"] = vega.delete_named(schema["marks"], "arrows") + + return schema \ No newline at end of file diff --git a/src/pyciemss/visuals/schemas/spring_graph.vg.json b/src/pyciemss/visuals/schemas/spring_graph.vg.json index 12a01dccb..c78b6f326 100644 --- a/src/pyciemss/visuals/schemas/spring_graph.vg.json +++ b/src/pyciemss/visuals/schemas/spring_graph.vg.json @@ -1,188 +1,256 @@ { - "$schema": "https://vega.github.io/schema/vega/v5.json", - "description": "A node-link diagram with force-directed layout.", - "width": 300, - "height": 300, - "padding": 0, - - "signals": [ - { "name": "cx", "update": "width / 2" }, - { "name": "cy", "update": "height / 2" }, - { "name": "nodeRadius", "value": 15}, - { "name": "nodeCharge", "value": -80}, - { "name": "linkDistance", "value": 80}, - { "name": "static", "value": true, - "bind": {"input": "checkbox"} }, - { - "description": "State variable for active node fix status.", - "name": "fix", "value": false, - "on": [ - { - "events": "symbol:mouseout[!event.buttons], window:mouseup", - "update": "false" - }, - { - "events": "symbol:mouseover", - "update": "fix || true" + "$schema": "https://vega.github.io/schema/vega/v5.json", + "description": "A node-link diagram with force-directed layout.", + "width": 500, + "height": 500, + "padding": 0, + + "signals": [ + { "name": "cx", "update": "width / 2" }, + { "name": "cy", "update": "height / 2" }, + { "name": "nodeRadius", "value": 15}, + { "name": "nodeCharge", "value": -80}, + { "name": "linkDistance", "value": 80}, + { "name": "layoutdata", "value": true, + "bind": {"input": "checkbox"} }, + { + "description": "State variable for active node fix status.", + "name": "fix", "value": false, + "on": [ + { + "events": "symbol:mouseout[!event.buttons], window:mouseup", + "update": "false" + }, + { + "events": "symbol:mouseover", + "update": "fix || true" + }, + { + "events": "[symbol:mousedown, window:mouseup] > window:mousemove!", + "update": "xy()", + "force": true + } + ] + }, + { + "description": "Graph node most recently interacted with.", + "name": "node", "value": null, + "on": [ + { + "events": "symbol:mouseover", + "update": "fix === true ? item() : node" + } + ] + }, + + { + "description": "Flag to restart Force simulation upon data changes.", + "name": "restart", "value": false, + "on": [ + {"events": {"signal": "fix"}, "update": "fix && fix.length"}, + {"events": {"signal": "layoutdata"}, "update": "true"} + ] + + } + ], + + "scales": [ + { + "name": "color", + "type": "ordinal", + "domain": {"data": "node-data", "field": "group"}, + "range": {"scheme": "category20c"} + }, + + { + "name": "colorlink", + "type": "ordinal", + "domain": {"data": "link-data", "field": "group"}, + "range": {"scheme": "category20c"} + }, + { + "name": "xscale", + "domain": {"data": "node-data", "field": "fx"}, + "range": [10, {"signal": "width - 10"}] + }, + { + "name": "yscale", + "domain": {"data": "node-data", "field": "fy"}, + "range": [10, {"signal": "height - 10"}] + } + ], + + "legends": [ + { + "title": "Group", + "stroke": "color", + "symbolType": "stroke" + }, + + { + "title": "Link Group", + "stroke": "colorlink", + "symbolType": "stroke" + } + ], + + "marks": [ + { + "name": "nodes", + "type": "symbol", + "zindex": 1, + + "from": {"data": "node-data"}, + + + "transform": [ + { + "type": "force", + "iterations": 300, + "restart": {"signal": "restart"}, + "static": true, + "signal": "force", + "forces": [ + {"force": "center", "x": {"signal": "cx"}, "y": {"signal": "cy"}}, + {"force": "collide", "radius": {"signal": "nodeRadius"}}, + {"force": "nbody", "strength": {"signal": "nodeCharge"}}, + {"force": "link", "links": "link-data", "distance": {"signal": "linkDistance"}} + ] + } + ], + + "encode": { + "enter": { + "fill": {"value": "color", "field": "group"}, + "stroke": {"value": "white"} }, - { - "events": "[symbol:mousedown, window:mouseup] > window:mousemove!", - "update": "xy()", - "force": true - } - ] + "update": { + "size": {"signal": "2 * nodeRadius * nodeRadius"}, + "cursor": {"value": "pointer"}, + "fy": {"signal": "node != null && node.datum.id == datum.id && fix.length == 2 ? fix[1] : (layoutdata ? scale('yscale', datum.fy) : null)"}, + "fx": {"signal": "node != null && node.datum.id == datum.id && fix.length == 2 ? fix[0] : (layoutdata ? scale('xscale', datum.fx) : null)"} + } + } + }, + { + "type": "text", + "name": "labels", + "from": {"data": "nodes"}, + "zindex": 2, + "interactive": false, + "transform": [ + { + "type": "label", + "avoidMarks": ["nodes"], + "anchor": ["top", "bottom", "right", "left"], + "offset": [1], + "size": { + "signal": "[width + 60, height]" + } + } + ], + "encode": { + "enter": { + "fill": {"value": "black"}, + "align": {"value": "center"}, + "baseline": {"value": "middle"}, + "fontSize": {"value": 10}, + "text": {"field": "datum.id"} + }, + "update": { + "x": {"field": "x"}, + "y": {"field": "y"} + } + } + }, + { + "type": "path", + "from": {"data": "link-data"}, + "interactive": false, + "encode": { + "update": { + "stroke": {"scale": "colorlink", "field": "group"}, + "strokeWidth": {"value": 0.5} + } }, - { - "description": "Graph node most recently interacted with.", - "name": "node", "value": null, - "on": [ - { - "events": "symbol:mouseover", - "update": "fix === true ? item() : node" + "transform": [ + { + "type": "linkpath", + "require": {"signal": "force"}, + "shape": "line", + "sourceX": "datum.source.x", "sourceY": "datum.source.y", + "targetX": "datum.target.x", "targetY": "datum.target.y" + } + ] + }, + { + "name":"arrows", + "type": "symbol", + "from": {"data": "link-data"}, + "zindex": {"value": 40}, + "encode": { + "enter": { + "fill": {"scale": "colorlink", "field": "group"}, + "stroke": {"scale": "colorlink", "field": "group"}, + "shape": {"value": "triangle-right"}, + "size": {"value": 40} + }, + "update": { + "x": {"field": "target.x"}, + "y": {"field": "target.y"} + }, + "hover": { + "opacity": {"value": 1} } - ] }, - { - "description": "Flag to restart Force simulation upon data changes.", - "name": "restart", "value": false, - "on": [ - {"events": {"signal": "fix"}, "update": "fix && fix.length"} - ] - } - ], - - "scales": [ - { - "name": "color", - "type": "ordinal", - "domain": {"data": "node-data", "field": "group"}, - "range": {"scheme": "category20c"} - } - ], - - "legends": [ - { - "title": "Group", - "stroke": "color", - "symbolType": "stroke" - } - ], - - "marks": [ - { - "name": "nodes", - "type": "symbol", - "zindex": 1, - - "from": {"data": "node-data"}, - "on": [ + "transform": [ { - "trigger": "fix", - "modify": "node", - "values": "fix === true ? {fx: node.x, fy: node.y} : {fx: fix[0], fy: fix[1]}" + "type": "formula", + "as": "tan", + "expr": "atan2((datum.datum.target.y-datum.datum.source.y),(datum.datum.target.x-datum.datum.source.x))" }, { - "trigger": "!fix", - "modify": "node", "values": "{fx: null, fy: null}" - } - ], - - "encode": { - "enter": { - "fill": {"scale": "color", "field": "group"}, - "stroke": {"value": "white"} + "type": "formula", + "as": "angle", + "expr": "datum.tan*180/PI" }, - "update": { - "size": {"signal": "2 * nodeRadius * nodeRadius"}, - "cursor": {"value": "pointer"} - } - }, - - "transform": [ { - "type": "force", - "iterations": 300, - "restart": {"signal": "restart"}, - "static": {"signal": "static"}, - "signal": "force", - "forces": [ - {"force": "center", "x": {"signal": "cx"}, "y": {"signal": "cy"}}, - {"force": "collide", "radius": {"signal": "nodeRadius"}}, - {"force": "nbody", "strength": {"signal": "nodeCharge"}}, - {"force": "link", "links": "link-data", "distance": {"signal": "linkDistance"}} - ] - } - ] - }, - { - "type": "text", - "name": "labels", - "from": {"data": "nodes"}, - "zindex": 2, - "interactive": false, - "transform" : [ - {"type": "formula", "as": "y", "expr": "datum.y"} - ], - "encode": { - "enter": { - "fill": {"value": "black"}, - "align": {"value": "center"}, - "baseline": {"value": "middle"}, - "fontSize": {"value":15}, - "text": {"field": "datum.label"} + "type": "formula", + "as": "y", + "expr": "datum.datum.target.y - nodeRadius*sin(datum.tan)" }, - "update": { - "x": {"field": "x"}, - "y": {"field": "y"} - } - } - }, - { - "type": "path", - "from": {"data": "link-data"}, - "interactive": false, - "encode": { - "update": { - "stroke": {"value": "#ccc"}, - "strokeWidth": {"value": 0.5} - } - }, - "transform": [ { - "type": "linkpath", - "require": {"signal": "force"}, - "shape": "line", - "sourceX": "datum.source.x", "sourceY": "datum.source.y", - "targetX": "datum.target.x", "targetY": "datum.target.y" - } - ] + "type": "formula", + "as": "x", + "expr": "datum.datum.target.x - nodeRadius*cos(datum.tan)" + } + ] } - ], + ], - "data": [ - { - "name": "node-data", - "values": [ - {"id": 0, "label": "Zero"}, - {"id": 1, "label": "One"}, - {"id": 2, "label": "Two"}, - {"id": 3, "label": "Three"}, - {"id": 4, "label": "Four"}, - {"id": 5, "label": "Five"}, - {"id": 6, "label": "Six"} - ] - }, - { - "name": "link-data", - "values": [ - {"id": 1, "source": 0, "target": 1}, - {"id": 2, "source": 0, "target": 2}, - {"id": 3, "source": 0, "target": 3}, - {"id": 4, "source": 0, "target": 4}, - {"id": 5, "source": 0, "target": 5}, - {"id": 6, "source": 0, "target": 6} - ] - } - ] - } - \ No newline at end of file + "data": [ + { + "name": "node-data", + "values": [ + {"id": 4, "label": "Zero", "group": "A", "fx": 2, "fy": 5}, + {"id": 1, "label": "One", "group": "A", "fx": 2, "fy": 10}, + {"id": 2, "label": "Two", "group": "B", "fx": 2, "fy": 5}, + {"id": 3, "label": "Three", "group": "B", "fx": 2, "fy": 3}, + {"id": 0, "label": "Four", "group": "C", "fx": 1, "fy": 5}, + {"id": 5, "label": "Five", "group": "C", "fx": 2, "fy": 5}, + {"id": 6, "label": "Six", "group": "C", "fx": 2, "fy": 5} + ] + }, + { + "name": "link-data", + "values": [ + {"id": 1, "source": 0, "target": 1, "group": "A"}, + {"id": 2, "source": 4, "target": 2, "group": "C"}, + {"id": 3, "source": 3, "target": 0, "group": "A"}, + {"id": 4, "source": 2, "target": 5, "group": "C"}, + {"id": 5, "source": 0, "target": 4, "group": "B"}, + {"id": 6, "source": 5, "target": 0, "group": "B"} + ] + } + ] +} \ No newline at end of file From f670196c07f06456da46fa80d1a6428d63c7b002 Mon Sep 17 00:00:00 2001 From: "Oostrom, Marjolein T" Date: Thu, 14 Sep 2023 22:05:36 -0700 Subject: [PATCH 03/16] any changes? --- notebook/visual examples/Graphs.ipynb | 48 +++++++++++++-------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/notebook/visual examples/Graphs.ipynb b/notebook/visual examples/Graphs.ipynb index 0a7fc7ec8..4c18da395 100644 --- a/notebook/visual examples/Graphs.ipynb +++ b/notebook/visual examples/Graphs.ipynb @@ -40,7 +40,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEsCAYAAAAvq2MDAABGfklEQVR4Ae29C3xU5Z3//31mJiQhkAyCCEp1EK3FqgRvgJeSqNSqUAm269r9t4a2v3a3v20N2+0W7XYZWivY129ruvvbW7stYbuV7b8FgrVaREuiUYgXGAS5qJjhJohIZrjlnuf3/Z7MJOfMJZlJZpIzM595nTPnPM95ru8z8znPfJ/LKMILBEAABEAgZwhA9HPmVqOiIAACMQh42G8V7wHeK3g3b2Xs8Id2PtBD/PZT3mNt1SHPKj6az9mZ8FbKIaU8tXys5P1B3st5T+kG0U8pTiQGAllAILeqICL9RKjKIvoiuOIUwd/MJyK6dXz08r6M93iaKSLNl6mGiCQ88UvS4EPCm+aQy3mXvCSu7HLOXqnb4lUgdTkgJRAAARCwL4EmLtoO3qWV7ePjQt5l285vYT9p3YvgSytcBF0eBPJAkHgzONwG3uUaH0geIhKG+GVOQ8Rcfk1IvNV8TR4Okr48cJawu5J3+SUhvywkLDvJ3NKXcsl18Zf0w2HCvyqa+YI8JCT+Yj6XTcosfnIu/pJPAKIvOLCDAAjkIgERRBFhaeHLuYjqVAYhAimiLKIbFmhpcc/layK2ci6t8iC7RXRFhMWPnSTpiDsclvgl4muOFz6XsJK/PETkoSFmpnoOL2nJNYknGi2Cv5795eEiZZMHhJQv/IAJ5+XmMFIHEX15gMlDR+rG3iRpyl4rCRJeIJAcAYQGgawgIMIpgipiKa1uEclYgiwiLoIZFmGpvIi+/AIQ4RW3hJGjiLWci4jLLn7ilqNck3jx8jBfM+cn8cNllHTkQSPiLvodeS2chpippD7ykJAw4paHBkkkSQQ7CIAACOQSARFRMYlE1llEUlr7ItDhVriIplmEJU5YXMVf3BJGjhJPzi9hh6TDBxK35CcPFnM8CWvOw3xN0g0/ZCQ+8UvC84H6u2ZOQ8LLrwI5SnmMhxREn/ACARDIQQIihmJOEVOICL0gEHEUoRWTSNj+LnZw+UUgLXq5JqYYEWGzuEpc8ZOjpCHnYnKROGKuEWGXVrbkKXnJw2YmBxZ7voQxpynmJBF1CSv5iUaLW87FT/oRxNRzgOOH8+JTknPiV7hcYt6RXwNSfjmXVr+Yo8okQQ6X8g0JggAIgICdCYgIjuMChk0wfErSGhdBNgt0CRGJOUaEU8SWnSTxJJz4iyCLnwi9HMv4Tc4lLT4l6egVoRYzkgi+iLyIvVyTB4I8HMKiL3lIeElXrovQi0ZLWmLSkT4G8Zd4kp48mCQv8ZN85RgWfQkvJh1JX/zlISFxfJKgeGAHARAAARAYeQIi8CLm8Uoy0PV48Xr9Ifq9KHACAiCQVgJI3BYEIPq2uA0oBAiAAAgMDwGI/vBwRi4gAAIgYAsCEH1b3AYUoocA3kEABNJNAKKfbsJIHwRAAARsRACib6ObgaKAAAiAQLoJZJrop5sH0gcBEACBrCYA0c/q24vKgQAIpJmAjJuXCVWSjUyakqOtd4i+rW8PCgcCIDAggZELIMsiyAxbmfkqM3tF/GV2bX+Tq0autKGcIfohEDiAAAiAQBIERORl2QQ5hkU+vCRD+JhEcsMXFKI/fKyREwiAQPYQkBa+CL4cM6pWEP2Mul0o7OAIIBYIRBPwfPdpWf0y+kKEj//x+WKyifClcGs+fKRMeUH0M+VOoZwgAAIpJeBZ+vvwCpX9putfuSC8gqU5nNjzxV+OYX9p+cua+WLjD/vZ7gjRt90tQYFAAAQygICM2hGbvrFccai8sj6/LGFs69Y/RL/nbuEdBEAABJIlEG7VN3FEeQjIkE3b2/gh+ny3sIEACIBArhCA6OfKnUY9QQAEkiOQpaEh+ll6Y1EtEAABEIhFAKIfiwr8QAAEQCBLCUD0s/TGolrDQQB5gEDmEYDoZ949Q4lBAATsQ0BG7cj4fBm+aZ9S9VMSiH4/cHAJBEAABAYgUM3XZYKWCH94DR72su8G0U/vvUHqIAAC2U1AWvg1oSrKAyB0at8DRN++9wYlAwEQsDcBmY0ru8zAlXV8ptq7uD2lg+j3cMA7CIBAjhFYt+WYCPWAtV40Z1KsBdcknqyxI617WcNHdhF/Ocq1+PsIX4Hoj/ANQPYgAAIjQ2DdlqMJCfSiOZNlYbXIQkoHrp89xbzDBxK3nIt9n+z8gujb+e6gbCAAAnYlIGvsSOetHMNllI5c8ZNj2M92R4i+7W4JCgQCIJABBLZzGSt4l9Y+H4xNOnTFLWYew8OObxB9O94VlAkEQAAE0kQAop8msEgWBEAABOxIAKJvx7sycJkQAgRAAAQGRQCiPyhsiAQCIAACmUkAop+Z9w2lBgEQAAErgQRdEP0EQSEYCIAACJgIyLj8GSa3/FWiyWnfU4i+fe8NSgYCIGBfAjJhS2bkyoQsKaU8BGSopviJ27Y7RN+2twYFA4FUE0B6KSQgoi8iL0dJVo5mt/jZcofo2/K2oFAgAAI2JyAi/wSXMTwjV9yipyL87G3fTQpp39KhZLYjsH57s1u3dBq2zBPnzt322KZd28ihjGnn/hV3Z4xd03ZgUaBhJ6CXlSS04JpaHoy14JqIvJhywuYdWX5BBF9m5Q57XZLJUCUTGGGznkBUBQ2Rb2ubq7RaqLVeSIrEdknh15La18OnxpE/UD5SqpYctMH/2D0+wxNvIGBDAtpbktCCa8obFIGPrIH4icjLUa7J90KWYBDxNxpB4mnHXdmxUCjTyBMQsafW9oc0aW9/pYkUfXNY/nD5Wfy9/hXzV5v9cQ4CWUBAxF6+G3KU6ojoN/HJON5tvfH30tblQ+GGmUCv2GtdRRGt+lhF6U/0w+H5Q+YjpZf4Vy5IqGUVjocjCNiYgIj9ei6fj3fZ5A9U5CGQfeYdqR327CSw/tXjpbqzexWLfWmiNUxE9MNpsfjX+B+fvzjsxhEEQGD4CfD3cPgzRY72I7B+y9EyrdV6Fnz5mdpfAYNE2je+OG8MKXX8f95oGvtq00fqo7MdYzSR0cHbX2T+wNVRYVGF31tua7tnf3XANRDIZAL8Hczk4qPsqSDAgl+pSa3qJ63gxRNGb5p2YWG+e7Trag4nnVV8sG5tnd27/7TnA99Pnt837Z0Pzs6yXu1z8YfOz8I/E8LfxySzz1D6TCLA379MKi7KmmoChkmnq3t7vHQ9FxSuLvUUX6sUidjHCxblf+jkuT9+efWr4+KJP3/wfCz85RD+KHTwAIG0ElBpTR2J25oAt/A9bNLZTjE6bEe51K5Pl57fmudS1w+hEoHfvn5o7Xd+9+ZXYqXBH74a2PhjkYEfCKSPAH/v0pc4UrY3gXWvHBPBj+q0nTB2VN0tV44bn2zrPl5tPzjd9tTsHz0/VxOVRIZRDlriXzG/OtIfbhCwOQHp+zL3YWXMxESIvs0/WekqHrfyY9rxxxQ6G+fNmHAF5ysfaj6kZvvgdFs84Q+owqKpMPOkhjNSGTYCMmQzckbues59Ce+23iD6tr496Svcui3HZCKJpUM2z0WH7rnugkCqWviRpX/p7RMbvvjLxnsj/ZXSy/0rF8gY58hLcIOAXQmI6MtnVo7hMtbxifjJkU/tudlG9O2JJztLtXbLUa8itSyydp8uHb+xqMB1Z6R/Kt3f+f93rP3ttsP3RaTJDxrnTP/Ku2Qae8QlOEHAlgRE7EXg5RguYCWfiFuOfGrPTdmzWChVOgnEauWfXzzq92zHX5DOfCXtji7d8PHvPXN1pH0ftn2hg304CehNSxNbcG3eyvIY5RJxjxT9WH4xoo6sF0R/ZPkPe+5sy/doUmLaseS94IaJW11ONdvimSbHz1/cv+FHz+y915w8fxB9/sfnzzT74TzXCaS3/iz6CZlh1LyVIuaRhRG/SNGv4kBiMpUjn9pz4++aPQuGUqWHwPqtx6q0JlkHvDeDUOftrF6PAU58Ph8Fg0FLqBkzZpDb7bb4xXOcae3cdJV347zI69yhO86PmbqRWOC2J4FI0ZcP/3Yu6mLe63i37QbRt+2tSU/B1m05yh9INdec+oypY9ZcekHRA2a//s6rqqpIhD8cpr6+nrZv306lpaVhrwGP1/1g066PzrVfZQ6olFrsX3mP7ResMpcZ5zlLQERfRuv4mIAI/jg+Ssvf9p9fiD7fqVzaYtnz2bSziU07US3vRLhUV1dTXV0d1dbWJhK8N8yjT+95+j8b3pvf68EngxjFw7GwgQAIJEMAop8MrSwIy6KvI6tRMfsCmVhiaf1Hhonl9vv9VFZWZrT63W53rCBx/Z7ffWzjV//rDctIIUXqp/7H76mKGwkXQAAEhkxADTkFJJAxBNZvb3br1rbmyAKz6Ed6JeSurKwkj8dDXq83ofDmQDuPBFYv+OeXHzT7cUu/3r9yQZnZD+cgAAKpJZD1op9aXJmd2ltPPnrL2dFTfmiuhaPz7P7r7vtGzLVxzOFinY8bN46ampoS7sA1p9HS0vLSn9b9a5fZ71y3a/+ffanqq2Y/nIMACKSWAEQ/tTxtnZr2ut2kuyNa+ipA3oA72YKLDT9sz082rhH+1JHV9Or/tbT02b8+zvA4voQNBEAgFQRUKhJBGplDQC8rjrLpkze4g2tgXjyKnf1vYZNO+Nh/6BhXP3p7A21fZRmrT5pWq0+vrIwRGl4gkEICuZ0URD/H7r/2lgRI6xJLtb93tJHyRic8Tl/iyogdOZaVlckh+f3djb8hf939ERGXc0s/+Q6CiETgBAEQiE8Aoh+fTVZeYdGvY9G3jtS5/1draPpnEx6nnxIw9Y/upI6zEX/MopaoeSuqU5I+EgEBEIhJAKIfE0v2empvsZfNKNbF1iZeuYm+sWVQ4/QHRaqrvZE2L4v+ZeGiqap8pX9QaaY2ElIDgawlANHP2lsbu2LcmVtKulumi1sDfP/Ey+TMu9nqmSbXoS1raN9T1l8WmnawPb80TTkiWRAAgRABiH4IRC4dtLfET1pfYqnz1Z/bSPf9wjJZynI9VQ6tD9EL3xtLpCNHDMGenyrGSAcE+iEA0e8HTn+XMvmajmXikQotPfQ6FRRfL6dp22N34BLBtJM25EgYBMwEIPpmGjlyziYebmVrae2XWKo8evwh+tb2j1GB1dsSZiiOXWuJjr0enQKGakYzgQ8IpIkARD9NYO2ebNzW/qRriCqfppQL/we7ibb/J7fo8yPRBLmVX4oO3EgscGcegcwoMUQ/M+5TyksZau37omz7ktPkGR1nHnzBNaYgLyWfj+3+D+maPT9ucea5CiX5iB22/AggcIJAOgmk5EudzgIi7fQRYOEv5Q5VGbcfZc/ZXnw7jX7gl3TFZLYEDaEIz76+l24+8WsqdnXGSgXLLsSiAj8QSCMBiH4a4WZC0iz8laS7V8Uq6ykqopOf/qfjnhvnTyRXQawg8f2a3yNq+lMHndyfFzNQ22miHeueVN87+hcxr2enJ2oFAiNOAKI/4rdg5AugvSWNpPWNcUtS8jGiG79CJz/x4Onzxp83Nm44ogN09gM/7Xt6Dp18d1TccJ3tRDtric6eIFKOxcobqCG8QAAEhoUARH9YMNs3E+11e0h3NyVawkDxdOqcdieNc5570jl1zhgqGHOO2k656NxHHgocuIxIu/tLa/fpIipq2rT9klO+mT3hVICUKmfh9/W48Q4CIJBOAiqdiSPt5AkMdwztLa4mTQ9JvqdV0T6t9RXFdE6cA+95BT6a9WXuFxg4qIR47sPx9LdvXU6Orrbg1oK/Plag264QfyLlZ+GfycIfILxAAATSSkClNXUkbmsC3Mp3k9bcyu9pnX+t49u+3d0Xl1a51tLnnC8OXPZkRF9Ry6LXSg9uC4wxhP5a5zv71o3yTuL8Q53IqlYtD1YMnClCgAAIDIWAGkpkxM1sAiz6VaS7n5BadJHr8LTW/5oi57K/fN0LRy86/MfJFDwiztj7QKKvKEha6bDJp6XLuW9Oww2TAh2uEknwC87NjY/l/bxv4TVFy5X3FJZWFjjYQaCXQGpPIPqp5ZlRqellJdLK90ihq7s+31DdUXGLnE8fe67h2VnbjPPO9rZTe09NyPvYkQ2FJaf3yuW+Pbbos9BTLTmpjhwF3Fvb7qHO7joiMoR+95kxDXdvLTXSZj/6n/wf1c9Wb/Ut9awcYt+X8HIZOwiAQIoJQPRTDDRTkuNWft9QTaWCnpZfG6Is5f/5jD2+eed/ZNjqXyu8p+6w83Ljn1JGtTfvumfznG9yGO6s7S6l0ePP0Mz7xxAptsVroyNWzVsZJdj6haWV1E29w0J/dfjC+u/vvbRX6H0FX/e56bSRn5GWUmLf9xNeIAACKSegUp4iEswIAtzK385mF0Non+2eVfdX7Q8Zwj4ur9O3fe5Ww18qsn5MVZCPxgNBkV5cMWfyoIZX6ueW1pCiBzktY1v0eum+bSH7vludDfoKvsbF0UY+RMqnlgdDo3sIr4EJIAQIJExAJRwSAbOGALfyy9iWv9mokFLB0tafUUAXGYL7N9MONnxr6kHD/LIvf1bD7rw5xjmRPrBozmTDFGTEG8QbC7+PhX+GRNVEwZn1syls3zc6dvOWGZ28cp33GrX81GI+YgMBEEghAYh+CmFmSlLaW1xLmu6V8u6hixvual1pCLvLQYffva2htzO3dsw3D2tyGm6laEnF7EnVEmewu968lO375KOQfb+5w+Vj4e/9VfHDvNX1X3RunMvXezZM3OrhgHcQSCEBiH4KYdo5qXDZuJXv4VY+d+D2+JS3/eRwk540RVxfuvho/Q8+vt8Q3aOuab6tBQvCghxUBfmeipnj2HYvIQe/601Lyzh2z68MPtkaKKn/89evNvJkJz1bsLRhOvX80iBSAcLELcILBFJJQKUyMaRlfwLcyq8hTQ9KSY+oiY03t1QbQyYVm3l8n9pCJXmdhpnnD0Vf97Wrwh7R1/TTRTdNqpI4qdhZ+GVY5rJwWo/svbzxycMXGOUQ+z4mboXJ4AgCqScA0U89U9umyK18N2ndRKGlEmQy1nNd1xnCfvekE3X/etVeaYXTWYf78HOjK43Wv1SGO3CncgduSkfTsPDXctqGiUns+/e9Xnos3LFr2PcxcYvxYAOB1BPoE/3Up40UbUaAW/le0rRMitWq8vd9omVVb8dp/ZzXD19S1GoI/ebR/19DwDHBsPMT6dXcgVspcVK5681eN3W01pGiGZIuJm4JBewgkH4CEP30M7ZNDnpZSTOLuFsKFG8yVoxWfjm38uskTqp3vfmRUkzcSjVVpAcC/ROA6PfPJ2uusmmnkkLr5ndFLLmw7oYd+64tOW20+s2TsfgBUc+tfMPkky4QmLiVLrIpSReJZCEBiH4W3tRYVeJWvtjyjXH2v+q6s/77HQ8aI2bMk7E6VEHw6aK/lOhGZ65yqIqKWReI7V380rbr55dWk6aHwhl8bcd033Mfjjf6GqRj9438vzrtpE7D9ESYuEV4gcBQCED0h0IvQ+JyK7+MW/k9wySVdTKWecmFVE/GSgYPJm4lQwthQWDwBCD6g2eXMTG5lc+Crw0zzVb9yfo/b/veXCl8v5OxElxyQdJJxW507Ha2yggh41eGdOxO3zzHMDlJ+lWudQ1Vrt+FOpfZBxO3GAI2EEieAEQ/eWYZFYNb+R5u5bNpp6fY5slY5iUX/KOuadw+6jZjrDyHTNlkLE4r4U1vWioPJn5A9UTpf+IWh1EOWZjNx2fYQAAEEiQA0U8QVKYG097iGtL0oJR/D/UtuSCTsZpuf8loVcs182QsTXr5fXMme8V/uHe96eEq7kA21viXvKvf8zRUvzfFaOGLfR8Tt4QKdhAYPIH0i/7gy4aYQyQQ2cqPNxkrYskFSsdkrGSqojctlc7jmBO3pqpjhzcXfHssaR16YKk6tTxYnkz6CAsCuUxA5XLls73u3Mr3kqZlUs8AjfWVtv6HMSJG3Dvmbg2Gl1wYjslYkmeiu2Hf72it46cPJm4lCg3hQCBBAhD9BEFlWjBu5bu5NdxEpI3JWI90/K/GJ7vKDZu9+Z+xYkzGSvmSC4NhFzlx63BrQeMtDdcb5Zf0/m3UT+vucjRKH4A4iZSjQnkD8guB8LI9ARRwBAlA9EcQfjqzZtGPOxnLvORCw+jP13/ouMgYzcMPiLRPxkqmzpi4lQwthAWBxAhA9BPjlHGhdJz/v50yuq2x4abXjBZz1GQs0mlbcmGwAJOduEU9SzEHBpsf4oFAthOA6GfhHTa38lkELf+MZZ6M9WbBbfX7XdeEW/kHFg3xn7FSidKcFiZumWngHASGRgCiPzR+tozNrfzNbKox7N3Pds+q+6v2h4zzQlf3vj1lr/ROeLL8M9YwT8ZKBpzRsYuJW8kgQ1gQiEsAoh8XTWZe4FZ+GeluFv2e8sebjGVdcoGCi+ZMMjp8e2LZ711vWioPrt56YeKW/e4RSpQZBDJX9DOD77CXUseZjBW55MJTRf97X5fKM1r9egQnYyUDSGPiVjK4EBYEYhKA6MfEkpme3Mr3cCu/KVx6cyvf/M9YEZOxRmTJhXAZkz1qTNxKFhnCg4CFAETfgiOzHdzK712i2DwZSykVNP//7XNjvtJ4lsYaI3jY9p+Wf8ZKF0nDvt/Riolb6QKc2emi9AkQgOgnACkTgnAr301acyu/ZzKWecmFOeedql9z7ZtzpR5nHe7Dz42uDK1NTzTSSy7QIF6YuDUIaIgCAiECEP0QiEw/aG+xlzQtk3p0RfwzlnkylmXJBU0bFt00aaHEybRdv7C0krppVbjcvzp8Yf33915qPNjEz1fwdZ+bToeWnVABUkpW5JSlm+VyzJ0fnKVf7Hpk7H//8O9eihkAniCQBQRUFtQBVWACOs5kLPOSCx09/4wVWqiMiFv5tpuMRUm8BjNxS3kDAclCL3ffS93dZUSqlEjzkYyX+ReSIuKHhPIRUR0pxwb/yrvYTXiBQEYTUBldehTeIMAt1ErS3UartyuilW+ejPVa4T11h52XhwRO22rJBaMig3hLbuKW+h0L/Bkixb9udMwhqmbRp4iXIvKRg6r9K+avJrxAIEMJ8Oc4Q0uOYvcS4Fb+dhYzbrESmSdjmf//VgKvH1MV5KPR0udW/uKKOZNr2J3Rm9Gxm8zErQFq25/oh6Pyl8ZPDscS/4q7scBbGAqOGUOAP78ZU9bhKWiG5cKt/DJu5fdMWlLKsuSC+Z+xrJOx9IFFNl1yYTD4Qx27/ODrib37zJiGu7eWGn+88jnni/TjvJ91Oqjb1XO1//dERD+cgiJVS4WjF/u95YbJKOyPIwjYmYCyc+FQtoEJaG9xLWky/nBkj+mfsSInY1mWXFC0pGL2pOqBU8+cEDrGxK0ph/5wy+ec9YlXQqkdX277u7f+1D3jC4lG4i+Qj5xqsf+xe8T2n2g0hAOBESPAn9kRyxsZD5EAt/LjTsYyt/IzeTJWMojYvl/DvdMPGnF2P9NBJ/15xnnst06adtuz9KnvnqUp100hZ94YDmaYyPgoLXffoZPnWtfveP/I6peaZn10rv0q9o+3BZRTlUP44+HJeP+sqgBEP4NvJ7fya0iTIXJH1MTGm1uqjQlXis085slYfyj6uq9dFfYImqafLrppUlUGVztu0Q37vkzcevdPM+iDvXHDUSk35MuWErkviR8m4go/AP5Y8S8NY0+c7bg54lLYCeEPk8DR1gQg+ra+PfELx618N9vym8MhzLZo85ILJ52T99UX3m+ssSNhuQPXFv+MJWVJx65XTvk1tZxiVY9OvXbiX9Kd93/zTOH4KdKqjw4wsE/gNX/zH//s31+5SxOVRAbnL5OPCovKYeOPJAO3nQgoOxUGZUmcALfyvaRpmcQwL7kg7riTsUhn1JILUpdkdn4Q9nVqR0T8zdU/p7vurqDiwv4sPhGR4jg/ON321N1PvHip2eQTDqq4c9f/+D0VYTeOIGA3AspuBUJ5+ggY5oqutntJUymR5l3xrvvGl3e2EZ39iPZ3TPjg3z646oKtgWIa6+pueHbWNmPkyllHxJILTsfMihsn+igLXyz4/MtHb2dOnqjq3fko0ZxvRnkPxaOzW++c9ejzKqbwOxwVGM45FLqIm04CKp2JI+3BEdDPP/wgC71MIOI9uTRaOh0tha7uQomVjZOxpF6xdvMvH8v1ud8hKv97i1eqHNLin/2j5+fqCFMPf6n8/sfnT01VPkgHBFJJgD+fqUwOacUlkMAFvWkpmydoFSny0BBfmlT3awV3txxxXV4kSSmHqqiYdUFWTiYKtfKbuJXf9ytIKj1x+uv0tbrryFWQts/5a/6Tv/n8v2+5X7Iz79yZvti/8p4asx/OQcAOBNL2ZbBD5TKlDIYZp7NtFZFOumU/UB0/dE6hxsJ7Di2YM/XigcJm6nUW/Uru1GZ+ETX47oG1VOi+L8I31c7A9T987q3IUT38xfJxa39mqjNDeiAwVAL82RxqEog/FALGbNKO7vWpaN3HK0c3Oc85XPpmVf5Yltrz+yao9TK4+nMb6b5f3NnrTuPJoZPnNt76481ReSnlnOrHIm1pJJ/xSY9IBSD6I4K9J1PDnENqPbfwrWaJnsvh9yCdd9mLNO32s6RGXUHNTTO5VUukHLSn66K2d48F84vPvE036B2to51dBRT3pQLk0EvU7SuzyuTArXzuwO3uHbraW/1v7/s9jZ20oNed5pPrfrBpV2SnLt+iJf4V86vTnDWSB4GkCKikQiNwyggYLfxOvTmu4LuKdtF1i1+nsRct5Ez7eyjwZd46Wog+3E309tNEna3sEWdTqkLdsSJrbPva6+Z+kG7maKqvUgdoWUDG0btNvgmder1eqqurM/aEIoQC/fML7/zyHze9/eWQ0zjwl2sDm3jk/hluvIGAHQjw59IOxcitMujNSz3UqWR4YSxRCtJ1X9lM4y6TJZBjXe8XVndne9exI0ec57+zmvKoLUZYFSCXKs8WU482/XlMb2VLv7CWFv5b0rb8Ohb7yspK8ng8JOe96SVwEsvEo4iGPIongawRBASSIsCfy6TCI3AKCOhND4vgl0YlJa37m5d8SHlF5VHXkvQ4GTxHBTt+1jy6/YNx0VGVj1z5LPxeWWMm+nIG+bDo15ImY8G53mJ/sXYDTSu3+vVejH0SCASorKyMvF4vVVdXU11dHSX5qvcs/cPcyDgHHp+vIv3gBoGRJIAP5DDT15uWejnLZbxbNxH8uY9oUo6rrRcG79JaH1FbnjhF5z6cHiOV5WreSilLjEuZ46W9JXWktVVsv16/miaXGmsSJVqTxYsX07333ktut9sQ/kGIPk1d+oegjhyzX1g0zo+llxO9DQg3DAQg+sMAOZxFP2adIN3+o4ODEvxw4vGOunsnvfiomzpaPhYVxEVTVflKf5R/BnnEFP2/fv1FmnD5pxKtRm1trdGyD7fwvV6v4U40fjjc1IefrtdaWR5ASuly/8oFdeEwOILASBOA6A/jHdDPL60mTQ9FZXnrI09R/tjPRvmnyqPj7GaqfzTaZKRptfr0yspUZTMc6eg/Pdwjqt2qlHS3m7at+Sqda55iyfvPVhNdudDi1Z+jrKyM6uut6+7PnTuXkm3tQ/T7o4xrdiGg7FKQbC9HaAJWE5F2W+o66ZqNdNUDd1r80uHYs341HXn1waikXQXjVLk3EOU/zB7GryCtLjGy7dJlxrHnT8vdpMlDineK8dq5gSh4xHohSdE3Rxah93oH1dI/wDb9nvKbEoRN3wQDp8NFoN98IPr94kndRf3C0krqpshZo0G6/dGdpJzGAmmpyy1GSmLmeeF7Miu3xHpVLVHzVlRb/VLr6mudk4e09hApfvDpUEe24qNmNw3u9fafiI7vtca9/e/P0a3fGW31TMzl8/mopqbG6MxNLEZPqI4u/fLl33smaq19iH4PH7zbh4CyT1GyuyTcgVvLNbyX977tvMt+T9d+ZUGfR5rP3nnmaTrw0vyIXOq5QzfUso64MoCz39a5RdgHSCiZy5p2kKIAafLz0U9vPz+Djr+9kMyviVduom9smWf2Svf5O8dPr533kxctw0T5y7XD//h8fqilO3ekDwKJE+DPZeKBEXLwBPSmh5ujTDuz/vppGnvR/ERTLS+PNstv3rw50ehEbad+Ty+tiHrIsOhHfQ6MyWNal/Cvk1Dr3Mgm9HBQLGRDaJ0bSUW9BdnHx7tsdfJGDvJz/n5yOQIqzhISMSdnkQqQN3CAiGbwPizbF3/x6u9feudDC1ulaLV/5fzKYSlAkpkgeO4SULlb9eGruSGgnd3bI3IM0h0r+EFAbO6ghF51dXW94Wpqaozz8NFwDPwWoBceVqTJauJR9EfSVEDD1Ton49VTGVeBTw2xT0F7SwJsNioxUg29NX9+Xd24T94eekiFPNN3EHu+5G8xUymlsNJm+pgj5UESgOgPElwy0bQsmUwU2SSvZ9HvGYmSTGIc1u/3U2lpKcnR7XazTxJbw4+JWuVZk0Sc+EH7WueKfKQp0Ns6JyL+BdEj7JTel/YW13DeD5pzeWPUDZ2X/82zruKCPLN3Ws5/+/qhX3znd29+JTJxhTH6kUjgtgEBiP4w3AQWfS9ns4z3vu386T6a8aXSPo/EzyorK6msrIzkmHisUMg3fk7U/F7I0c8hbDsnChCR1eziIr+dxvfHMvHUFcyjo2U/oQdmS981pe2ltT70/bV7X//v19+rMGeiFEw7Zh44tw8BiP4w3IuYon/RjatpeoWldZpIUaR1L638QCCQSPDoMLFFfwMHrOZ92Frnklcqd+0tqWMTz9wdzqtoz2XfpPyp5dTa0aUrPtHRXnD+JfmpzMuc1pa9zU8eC7R/oVt3H6559b0TO48GSuW6wrLKggG7DQlA9IfhpqRS9Kurq8nv9yc9pLC3mntijtfP+CUZvvXw95691VP8Gec11ufo+HPv0KduupqooKQXQapODnx47hfb9p+2mHXOtnX6fvHqO/V1f1delap8kA4IpJLAEEQ/lcXI7rRiiv4gzTti1qmqqqKFCxcODtquNRvp2Jt3RkTOaNH3fPfpVZqo8iuzLqOrJkf3cVxx5kW6suyzneTKd0XUe9DO90+2rml8O/hAjASC3FNeWjFnsj/GNXiBwIgTgOgPwy1g0S/jbDbzbt4G1ZE7c+ZMWrVqFZWWlprTSvx8yxONdPb4LEsEpTJyjX2Pd7ObWs5uZsE3YBTmOekHn7mm0+V0Ron7ePqIbvnkeeQYO8lS9UE4gvveP/u73QfPWFr44XSUoiUVsydVh904goDdCED0h+GOxBmySXTHChlLfskwFCGcxQF6/hG2c+jI5nD5cI20CRdkqEfP0mc9pLvWayJD8Ilf050HG9aMX33L5puki4I9IrY83Ua3XtLWVHLh5eP5UjHvSW2dXXpT3a6TY0+3dM6OHVGvXjRncmXsa7nhi1ranwBEf5juEbf2A5wVCy6/h7ckJ2eFow362Nr8R2r48Wci47PgZ9TnwPPIH0p1l97M9eh9eP2Na23Dt1xrjeUsDly0iLZdvZIvx97yXOrgtEmjL77k/EIane+MHajPN9jS3vXiWwfP5B060RrFri+YrmfBl190fV44AwEbEsioL7sN+SVcJBb9Wg48sssw7HwySB/stD54iAa9DAPXZ9g3z9Lfl2mt1nPGMQWf/YlKJu87cO33P7Yt/44B198ZW+D0XX7hmGMlRXnHXA4a43I5JrW2d7/b3tnlPvRRS+fB463Xc5oe3vvZ9GpVUFBVMXOcPNj7CYdLIDDyBCD6w3QP4iy4RlS+vJGco6w29nSU6fRRosZ/ipGySvuCa5ZMh+DwLP1DpdZ6VTgJpSi4Ns977FrH21eE/ejiGxp4v5rdJQHH+dRQ+HndoUal73Ou6aeLbppUxflhA4GMIJC+L0NGVH/4Cqk3e93U2SojOqwt7eFaWjn2+HwiV8G4oS6DMBwUPd/9w0OadG8HaT+Cb5h4QmUKflh48YIGx6JvkyLrr6xQgMEf9AH+8lRWzJk8LLOOB19OxAQBKwH+3Fo94EofATbxeDn1Zbxbt1sf/j3lF1sW67IGGJrr+Tf9dMfx/4hORFNG/ImK57s9QzLDFShU7fu2jvrmpBJ1uu8Beu39DTR6fJ/gy4ziPFoYnjm8fsvRMk3qUSKKWv6Y/ZLZgpofPo6CgmqYc5LBhrB2IWBD0bcLmtSXw1iKuJNkSYM+sSJ5qQDd/uhhUo6rxJXKfd/RII3Z8e90kSuGudnpukfd9ugzqcwvlWl5jCGZ51axyPZOShjnOOOry/v21IEFv6As8hcMC38lC3/YPNTFZR2wF5fDhLcdisWeCgpqIfZhJDhmIgGViYXO5DLHbe3nFe2kTz2iUin8Xcf3dR18Y0PH1LzmgtjMlI9c+eWR4hg77PD69gh+3xh8yX2682DDs3lL+1rzeQVBuv5Lx8jp6rPp868XyiuoilWndVuOyYgfY4SNUrSEtPaRUqXcTyDDPj2Sh3nXRHUOh8NH3d0+NuOIac58GecgkJEEVEaWOsMLrZ9bymJD0Wu9i/DftOQjyisyhGlI1Ty4lWjXGqJRMQewmFq5qlbNW1ExpLxSHFmGZFKX5hY+iRiTvOY499Svyfth36qkcQQ/3n/+civfo0k1SVqyq4L8cWixC4nM2FHK1BFQqUsKKSVKIL6ZR1JQAbruy3U07rJydkWYgdhngK2js5sC7zednrDnX8coZ/SolVOdLnr2+ITt9194bGZvUop+qu5YaYsRKCL4/Y3BN8pcMnkfXV0xic9NfFS/o5DWbjnqVaSWcRwiTRsW3TSp12Rk+OENBHKEgMqRetqumqFZujLywyRcpmLmFR6k0gdfoZJL5rDvgLN2NdHpY0eP5+e9+9SoCW37OUrs7c/fuJq2NpfQv83YW3fX+Sf6flE4aLG6fWVN7FjD4xsakvkE52aMwVeKgo+5frn3AefzfUNaJ1zqo098ZiqH6eOWQNnZtCOtfMOEoxyqomLWBbWcBjYQyDkCEP0RvOUDCr9RNhWg8Ze9SJfefo7yi928jyXl7CTd5aL2c5paTx6m914YTR+9+yluwhpiaUSLfOtsp581XfD2Ywc++fHwpZdvfaPxovyWPkF1OWaqOH9LGI6TrmNI8MOdrKRU3DH4fTZ9oiC5HNxh+5iP+ikYm3Zk5I7Y8yVUcNGcSfE5SQjsIJDFBFQW1y0jqhYSfml1DtiaH3SFWPBpJ2dx9gTNbP+Zr7l7jGErd+d1Brfe+tqxAkdXqCNUBbhjd2qsTtBB551ARM93n36Cf6n0mpcKVfu+X+c9RpZJV9M+VU+Tr+qz6Sco+JL9ui1H+ReMelDO+cGI9XF6QOA9RwmoHK23raodmrjFwkQpnkBE9JHzwk7nW081uU+8erlUOqjHBq9r/9fTndo5RdxTC1sOb75521gWw5C5RA3riB4W/FUs+JVSFtlF8BMbg1/ALXxvjHGokkrfvn57s1u3tDWRIqN1r5yOmRU3TvQRXiCQowRU7tTb/jXVm5aKjV3Ef8it/lZV1O7Lv23UUdc0rrgOzv/TLMprDxjCvq374/vu6/BO0poM97XuU/vWXf9mqLXPwRXVcMfuYkrjy2OMwY8ekvk/rh9d3TsGX0bolH5+L+WP7TNBEdWTq2Bhor9G2LRjGpuvDyyaM9mw66exakgaBGxNAKJvw9sTEn8xdwym5b+BHFRbO/qhOk1KWrSGsDu7WvbdVT93Ulj413Td0fhwx5d7xbTq0oMNvJvt5Wn7Y5V4gp/IGPx4QzLj3UbuwBVbvjxMSSmsdR+PE/xzh4DKnapmXk0Ns09XGwuWLiNNYoeXVqr5V0CQ5E/LFbG4qzpy5teZW8DcyjV3YJL79N6G8pc/2yvs/9D15fr/6rhjLoVez872NUwfc6b3Oqtkyv9cJdaQzC85n6//Qd4ve8shq2TSlQuIzJOuFCU9rJTrbx2bT3oqJlmFbjYOBoFcfFO5WOlcqjMLn8m8QTTt0K/rr3lrea/A3tWxsmFP18W9Qu+b+6rPndcuDxjGpLhjV5WnakRPLME3r4PPGZIh+JFj8BMYkmnEjXjD2PwIIHCCABNQvGPLcgLW0StEM3f/Q6Pn4P8Yph3p2J3d/s/HWvQow6bvjhzRo8lPeQUzzb8gaBCvJIZkXs3JGyYpPgZJqUp1x4paPk96Y9NOE0eSX0ekSC/mVr70l7AXNhDIXQIqd6ueWzVn4a8jUqEWvg7ObXzg2HnN2wyhF+Evbf8Psnbs7pxEpEPiq3xq3oq+GbyU3MszyGWRExmDH68k/AvHbNoa/Nj8eBnAHwQylIDK0HKj2EkSMIYutraK7d/oE1C68/A9m28aG+7YjRzR84UpHzQ+9ol3jF8DRlaDHNHjSWRZ5KsW1pP7wtADiXMzlkV2VKohTBTjhxy36hXG5jNObCBgJgDRN9PI8vP1rx4v1V3d3OInowU/qj3gu+dPN4bs90T/1Hlfw0867+u17//wE+/Vf3HK+31inIRt3dMzJFMmXVWGsaZ6DH443VjHda8ca2abjluuKYzNFwzYQcAgANE3MAzlLbPirm/8YKHu1uvDpY4c0fNAx/frt3RN7xX6qBE9ROVq3kp5cISTiDqGBH+zJup9oEyPtSzytV9o4v6C3jBEtIFcBdzCH3jSFYeNu7Fpx9R5jbH5cUHhQk4SgOjn4G23jGrh+p8X9B3Mb/3w4o68YjpXeBHvxmRdevfEacpz6M6yMe8GLug6MmF892Eapdv7HdEjI3RSvSwyFzGpjVv5taTImOOgMDY/KXYInP0EIPrZf4+jaihmnu6u7t/yzb8s6uIAHpM799P5XYcOTtN7Z0SO6BHB111aJkMZZhVJKqEhmaT6XRZZ0kl051Y+xuYnCgvh0kbAzgnz997OxUPZUkkgJIirOM0y3oe05etz59qdRX8RXqLY8/AzbDbqlrQNwVeKgkuca3d+y7W2t48glWPw4xV+/dZjVVrTE8Z1rJtvYMAbCJgJQPTNNLL4fP2WD5Zp0t40VLHu8Rd2/fbY6dZ/Cactgr82z3vMskrmxTc00MU39D0AiIIcfuFA/QMcJqkNY/OTwoXAOUgAop/lN319zyqTm0mRucOUUvlq6eikXzbuN/oAZIROKpdFTqacYrbSXd3bQ3HsPTY/VEgcQGC4CUD0h5v4MOYXEkEZqePpL9sxha5dF5SMuirPpWhC8Sgq1OcCBafec7ef8FNXZyf9/uyMj8g5dnxhnrO/ZOipN987Wn3k86N7V8mU0Nfe30Cjx/e18DXtoLyChJZFlujJ7BibnwwthM1VAhD9LL3zhv1eq+0UWkc+RjWD104r+e3FEwpmsTlGlj6IEaTP6/iplvY3D58atefQWZpSUtR3IeLs2p1L6ZIj64iFPUhX37tzuARfirEOY/MFA3YQ6JcARL9fPCN5cfB5D2TSueKiwt9Mn1I8h8X+4mRzOdXSQRt3fUBdbYryXa6Y0ctf/fPT7iuuf9+ySqam1ckuixwz8Tie/JDD2Pw4bOANAmYCEH0zjSw5507bVZp0ZYzqBO+YMX7T2ELX52JcS8prz9FTtG3fCRpdEN3qL+w+3XFby3/njdJtPWkqSnpZ5J6Iib9zKx9j8xPHhZA5TACin2U3P3LGral6wbuvn7gt36XKTX5DOj3S3EJ73nqbTrsmRaVzccduuq7tOaIklm6ISiRBD27lY2x+gqwQLLMJpKL0KhWJIA37EDAPWTSVKviZayfUF45yftbkl5JTafEfee8gnXaeH5XeVe0vP/7xufctjbqQYg+MzU8xUCSX1QQg+ll0e7nFa7Jr91Vs1sdL1lx4XsEDfT6pPXvdf5KOHj1DnSo/MuG6RXMmpeyXRWTiYbf5QYd188NUcASB2AQg+rG5ZKSvWfzCFRhT6GycN2OCrJtvzJQN+6f6+JtXmmiUY3RUsizCaf2LwtCw1O2hjIOqIN9TMXNcIOTOvQNqDAIDEIDoDwAoUy5HiF9vsT9dOn5jUYHrzl6PNJ0cbj5HL715XBfkF1o/U5p+uuimSVVpypYwNj9dZJFuthKwfkGztZY5UK91rxyrJkUPmas6Jt+5Z97MCdPNfuk8/8/6Jhqfb23tj+o+d2b+zZeOTVe+XO++dfNJl1fMmdzvss/pKgfSBYFMIQDRz5Q7NUA5Wfy2s+hbllqYMXXMmksvKIqw5cdPKBAI0JIlS8jv95PH46EnnniC3G53/AgRV+r2HafmZh3hS3Rza+13Lij/y/8TdWGIHtY+DKybP0SciJ4jBFSO1DPrq8n2/Ci1XXDDxE0up5qXaOUrKysNka+urqZq3n0+H9XU1CQa3Qj3ny8coPFFBcZ5+O2Wlt/R+V2HB/zzlXD4RI/8oOsdm69JL79vzmRvonERDgRylQBEPwvufDx7fsXsC5KqnYi8tPCldV9bW2sIf11dXVJp/Mvz++nCMWMscT7RvpWmtzcGyKXKh/K/t+ZEuZXv0aSawn7p7jAO54MjCGQ6gViin+l1yrnyswCWsQButlZc11fMntT7t4fWa/27li9fbrTw169fT6Wlpf0Hjri6+qX3ThXnFRWbvXtEfyt7KR+58ln4vQF2DGmzjM0nXb9ozuQh/0fAkAqEyCCQIQRUhpQTxeyHQCzRDw3VnNVPtLiXpHUv+4YNG2j79u1xw8W6cOTNl1pfPfdxi33nY5372q9vfXZUT3hVq+atqOg5H/w7m7Okle+RFLiVv5g7cGvkHDsIgED/BFT/l3E1EwjEEv3xxa43PnXl+OuGUn6Px2O0+MvKyhJOJvDGBtrcMdsSvvXMhx89QL8e3+s5xLV4IsxZGJvfCzaNJ0g6awhA9LPgVsYSfWKTR7LmHTHlSAeuiLyM5Bk3bhw1NzeT2+1OmNKh+l/T6/l3WMJv3Ps+VY7ZWD/bHewzNw1hTR7uwK2m3uGpejWbdiotGcIBAiAQlwBEPy6azLkQU/Q1BSrmXJC4WnN1pSN34cKFNHPmTGpqaqKqqiqqrKzkK4lv+zevoTcLb7NEENH/Iwv/y7e+0XhRfkufycnlmDmYjl0WfYzNtxCGAwQSJwDRT5yVrUOyjVtHFnDBDRMbXU7VJ7KRAeK46+rqqKysLM7VeN49/pu2vHvmjBprGb7zy8Z3aefRALnzOoNbb33tWIGjS5aF4AgqwB27U1V5T8euYbbpVCV8gUZTYOGd51b5yaF94iaVv0PCWVcR1Qe4le8xruMNBEAgIQIqoVAIZHsCLPoijjPMBU33QmvmvOT8xKl2eml3s5xa9pUv7Dj6wemOyeI5tbDl8Oabt41l81NJu8qnQ67pB3fn39rQqZ13s8nG8suk4ky1RDHtynfIdcXYd/KumxZ0nk+aNMbmm+jgFAQSIQDRT4RSBoRhk0c1i6ZlGYbiQtem22eMT3hy1lCr+ab/NO0/ds6SzOiWI3T+5q/vu6/DO0lrMlrxiy5p3f0XV5135cG8Ky1hIx3Rot8X4qwqpm7nqL8tLv/bf+zzxRkIgMBABIZT9AcqC64PgYDV7NGXEJt4kpqV2xczuTNNdPoPrx0v6ujSDnPMaQdW0zV7fkRruu5o/AH9r1mfmnYBzZ02kQrzYv/Vojluf6LfG04Tm4DUEnXHilrCCwRAYEACEP0BEWVOgHVbjvqJ1CVkeo0tdG29Y8b42SavtJy+f7J1TePbwah1fspfuZfcp/ZQoHg6PXftr1vzCsYUJFqAhEQ/nJiiGnXHysWEFwiAQL8EIPr94smsi2u3HPUqUssiS82iv5bF/75I/1S5tda7arcen8LmJYtNXtKfdujX9RNOvDJ321UrqCPPMlFXLlv2PN2uSelt559X7BztaH/36vZ6onMfTaXAgTMcsG+4JztibyplM35jpw/flBNAgsNOQA17jsgwbQTWb29269Y2bu332M57M9IUuPuGCb58l3NwQ3J6E4p5EtzkO3HkTGtX/wb6mFGJ2jq79I3jT7ROcTsLR024lCivMGbIlrbOEycON03IP/4GTTy7I2YYw1PMPXkFM2Wkj+HGGwiAgIUARN+CI/Md67ccreTm8qrImoxyqZ13X3e+4tdVkdeG4A6+vDdQfzzQFuu/d4OcrtFxy8eorZXFvp061B2fnEgXjYst9FGRQh6tp0++WrBrtaazx+MMR1Vo8YdY4QACkQRUpAfcmU+Abft1RCrKHJLnUgdvv2b8jsJRzgU0xJeYdF7eE/jww1Ptsf4DN6icjq/pru41nI2Dd8s2vuVduvbjE1rGXHRFAmpviWp1HN/5JL355BesniEXbPwhEDiAgJUARN/KIytccc08UjtNgZuvHFc3sWSUiHXclrgEjbefbe3cWLfr5IXtnfrqWGGUQ1XoLr2MbfylkdevOPMiTb9+Nin3xyIvDc7ddvopeukxecCVRCeglqh5K6qj/eEDArlLAKKfpffemN3a1c0t/gj7fqi+Yu65efq4be6ivIXsFUMw2TdiY4vMphffag4Gz3V8LuJSr1NWvBRHLBNTyWgXzb3S3el0OQcerymJJLrHFX5lmfGbaHIIBwLZTEBlQeVQhTgEBhL+UDT/xyYU7L3swqKOolHOC9kEJCNlpIXuY5EvaO/sbn7/ZFvrviNnprXHadmH0uGGvV5MBQW1uqWtiR2WkTx5TkW3XDmO+CETDp7a40dvb6Dtq+6NkehyNW+lN4Y/vEAgJwlA9LP8tvcIf1ctRYzfp9S+gtzCr5I17eMNG53zCfeBSe78S1KbbURqu9ZspGNv3mn1VWjtW4HAleMEVI7XPyeqb9j4W9pquPUdqyU8VAY7uNO2suLGibL2D63bcqyJE7QsgjZlwqiNN1w2LkKMOVSqN93VQC/8vfQzRJirYNtPNWrbp4cCxiUA0Y+LJvsurN9ytEwT1VBqWv1BTbr6vjmTvRR69fyq6N4ecvYeFtwwcavLqWb3eqTz5OCLG+jtZyMfbvVs4knHHIV01gRpg0BaCED004LV3oka6/R06crBtfz1AaVUNeXn11TMHGf5r1vr/9b2MBjKom8+n488Hg8l8ycu1Nm6ieqWRy8y5yoYhwlbPfcE77lNQOV29XO79tzy9zABaf2X8ZHPo8f2s/8O0uRXDqojh6MubMahGK9Y8wMGu7yzCH55eTnJn7OXlZXFyK0fr7pHd1HnWesktKh/6uonPi6BQBYTgOhn8c0d7qqte+VYM/96cJvzZdPOoP7IRYTe7/dTTU0Nybk5zQHP3/rtWjq6LXKtIYziGRAcAuQCAYh+LtzlYaojd+LqyKwqZl/gY79S3hPevF6vYdKpra0lOU9a9D/cvZF2/Cqy4xiin/AdQMBsJgDRj393cSUJAmIq0qRk5I45VpBFP2Ikjfly9HldXR1VV1eTCL6IvZcfAHKMDtmPz6kjq+nV//tgRAh05kYAgTM3CUD0c/O+p7zWbz356C1nR0/5oTlhR+fZ/dfd942vmP36Ow8EAjRz5kxD9KXztqqqiiorK+nBBx80Wv79xTVfOxkM/vYfVtWeb/YrcnTt//FDX/mq2Q/nIJCLBCD6uXjX01Bn7XW7SXc3W5NWfvIGPFa/+C7pvBWhD4cQt8fjoZqaGiotLQ17D3jceSSwesE/v2xp6Sul6/0rF5QNGBkBQKA/AllwTWVBHVAFmxDQy4p1VFG8wR3sN4P3pLeysjIajHnn+d3HNn71v96w2PQVqZ/6H7+nivACgRwnoHK8/qh+CgnEFP3vHW2kvNFx1r3vP3Np4Yvwe7i1339I69VH1r+5+snGQ5Et/eXc0vdaQ8IFArlHAKKfe/c8bTXW3pI60lqWOe7L4/5fraHpn32gzyP9Z9f9cNPOj862y3IMvZkppRb7V95T0+uRthMkDAL2JgDRt/f9yajSaW+xlzQtsxR64pWb6BtbomfIWgKlznGmtXPTVd6NUfmpwqJxfm95IHU5ISUQyEwCEP3MvG+2LDV35paS7o5ae4e+f+JlcubdPByF/vmL+zf86Jm995rz4g/5Dv/j80vNfjgHgVwlwN+HXK36iNU7qzPW3hI/aW1dQvnqz22k+35h6VhNB4TObr3rskeemcJpu3nv3ZSDlvhXzK/u9cAJCOQwAYh+Dt/8dFRdxzLxSEZD6NCV6InssTpwJZ5Szqn+lXf55Rw7COQ6AYh+rn8CUlx/NvFwK1tLa7/EkvToCTvp7/ZfzH5Wf/ZIxfbO8dNr5/3kxcj1dkhhqGYq8CKNdBMYxvTVMOaFrHKEQNzW/qW3P0VfWieje1Iq/KdaOt64Zvlz0xgvP3D4PbTxhztIhUUedOCGgOAAAkyAvxf8jg0EUkgg1Nr3Rdn2JY8UC3/z2ba62/+x/tKT5zrkV4Tk0LsrpTE2v5cGTkCghwBEv4cD3lNMgIW/lEjLuP3oVv34y3fT/97aTQ6Xdc37JMvwmv/kbz7/71ukg9jSwpdk+IO9wf/4/IVynh07agECqSHA343UJIRUQCCSAAt/JenuVZH+PW4VoHv+zzN0w1dlKOclPX6Jvbe0dzay2B/a9f6pz8WKoYh2sFmnDGYdwgsEogjw9yPKDx4gkDICLPxVLPxPxE2wcPxBuu2RBrrmz86n/OIbOVwJ77G2A2+9f+rNlc/u0S+9c+KzsQKIH3+gg+RUZf7H7pF1/MULOwiAgIkAf0dMLpxmMgHblp2Fv5KFP06L31xs5aeL55ygcR7/yXEzzvxj4GY609I56eX9J8acONMupqAoM44ltrTwlXMhhmeaqeAcBKwElNUJFwikhwALf3wbf4wsAzTWV9r6HxwnxsUYXkrRaiooqoJJJwYceIGAiQBE3wQDp+klwMLvIer2kibLCpixck1U9FnsDxApLxZTI7xAIJpADB+Ifgwo8EovgZD4V5Mmyxo55lwHEn3+4AZJ6Wosl2ymhnMQGJgAf3cGDoQQIJAOAj3iTwu59V9GEQ+AWKLf06qnOlKOWv+Ku2sJLxAAgaQJQPSTRoYI6SDADwDppC0NpV36TtcU16c7Vowhcvj5oeAnhyOAETkhOik9ILFcI6ByrcKoLwiAAAjkMgGIfi7ffdQdBEAg5whA9HPuliddYUQAARDIIgIQ/Sy6magKCIAACAxEAKI/ECFcBwEQAIEsIpAS0c8iHqgKCIAACGQ1AYh+Vt9eVA4EQAAErAQg+lYecIEACKSEABKxKwGIvl3vDMoFAiAAAmkgANFPA1QkCQIgAAJ2JQDRt+udyf5yoYYgAAIjQACiPwLQkSUIgAAIjBQBiP5IkUe+IAACIDACBGwt+iPAA1mCAAiAQFYTgOhn9e1F5UAABEDASgCib+UBFwiAgK0JoHBDJQDRHypBxAcBEACBDCIA0c+gm4WiggAIgMBQCUD0h0oQ8e1GAOUBARDohwBEvx84uAQCIAAC2UYAop9tdxT1AQEQAIF+COSk6PfDA5dAAARAIKsJQPSz+vaiciAAAiBgJQDRt/KACwRAICcJ5E6lIfq5c69RUxAAARAgiD4+BCAAAiCQQwQg+jl0s1HVIRFAZBDICgIQ/ay4jagECIAACCRGAKKfGCeEAgEQAIGsIADRT+FtRFIgAAIgYHcCEH273yGUDwRAAARSSACin0KYSAoEQAAErATs54Lo2++eoEQgAAIgkDYCEP20oUXCIAACIGA/AhB9+90TlCi3CKC2IDCsBCD6w4obmYEACIDAyBKA6I8sf+QOAiAAAsNKAKI/rLgHlxligQAIgECqCED0U0US6YAACIBABhCA6GfATUIRQQAEQMBKYPAuiP7g2SEmCIAACGQcAYh+xt0yFBgEQAAEBk8Aoj94dogJAnYmgLKBQEwCEP2YWOAJAiAAAtlJAKKfnfcVtQIBEACBmAQg+jGx5IYnagkCIJB7BCD6uXfPUWMQAIEcJgDRz+Gbj6qDAAjkHoH+RT/3eKDGIAACIJDVBCD6WX17UTkQAAEQsBKA6Ft5wAUCINA/AVzNcAIQ/Qy/gSg+CIAACCRDAKKfDC2EBQEQAIEMJwDRz/AbaMfio0wgAAL2JQDRt++9QclAAARAIOUEIPopR4oEQQAEQMC+BEZG9O3LAyUDARAAgawmANHP6tuLyoEACICAlQBE38oDLhAAgZEhgFyHiQBEf5hAIxsQAAEQsAMBiL4d7gLKAAIgAALDRACiP0ygkc3QCSAFEACBoROA6A+dIVIAARAAgYwhANHPmFuFgoIACIDA0Alkl+gPnQdSAAEQAIGsJgDRz+rbi8qBAAiAgJXA/wOhMI931KH+0AAAAABJRU5ErkJggg==", + "image/png": "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", "text/plain": [ "" ] @@ -77,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "ece8d8e5", "metadata": {}, "outputs": [ @@ -97,37 +97,37 @@ "name": "node-data", "values": [ { - "fx": 97, - "fy": 72, - "group": "W", + "fx": 80, + "fy": 21, + "group": "Y", "id": 0, "label": "n0" }, { - "fx": 37, - "fy": 3, - "group": "X", + "fx": 73, + "fy": 43, + "group": "W", "id": 1, "label": "n1" }, { - "fx": 71, - "fy": 39, - "group": "W", + "fx": 16, + "fy": 55, + "group": "X", "id": 2, "label": "n2" }, { - "fx": 3, - "fy": 35, - "group": "X", + "fx": 59, + "fy": 58, + "group": "U", "id": 3, "label": "n3" }, { - "fx": 48, - "fy": 71, - "group": "U", + "fx": 15, + "fy": 45, + "group": "X", "id": 4, "label": "n4" } @@ -137,33 +137,33 @@ "name": "link-data", "values": [ { - "group": "Y", + "group": "U", "source": 0, "target": 1 }, { - "group": "Z", + "group": "T", "source": 0, "target": 2 }, { - "group": "Z", + "group": "W", "source": 0, "target": 3 }, { - "group": "W", + "group": "V", "source": 0, "target": 4 }, { - "group": "Z", + "group": "T", "source": 1, "target": 4 }, { - "group": "W", - "source": 2, + "group": "Y", + "source": 3, "target": 4 } ] From 3d5873bd74397406720e8210852366a7d3e5bb01 Mon Sep 17 00:00:00 2001 From: "Oostrom, Marjolein T" Date: Fri, 15 Sep 2023 00:54:28 -0700 Subject: [PATCH 04/16] all moved nodes stay stuck --- notebook/visual examples/Graphs.ipynb | 134 +++++++++++++----- src/pyciemss/visuals/graphs.py | 2 +- .../visuals/schemas/spring_graph.vg.json | 52 +++++-- 3 files changed, 142 insertions(+), 46 deletions(-) diff --git a/notebook/visual examples/Graphs.ipynb b/notebook/visual examples/Graphs.ipynb index 4c18da395..17b4d9b14 100644 --- a/notebook/visual examples/Graphs.ipynb +++ b/notebook/visual examples/Graphs.ipynb @@ -2,10 +2,19 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 25, "id": "a1299176", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + } + ], "source": [ "%load_ext autoreload\n", "%autoreload 2" @@ -13,18 +22,26 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 26, "id": "5c1729f7-1b0d-4913-8048-01624c506cc5", "metadata": {}, "outputs": [], "source": [ "import networkx as nx\n", - "from pyciemss.visuals import plots" + "from pyciemss.visuals import plots, vega\n" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, + "id": "07d29614", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 27, "id": "997ef041-0312-4b83-bbe2-32a6ddfe3d6c", "metadata": {}, "outputs": [], @@ -34,18 +51,18 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 28, "id": "a4b1668c", "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] }, - "execution_count": 4, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -77,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 34, "id": "ece8d8e5", "metadata": {}, "outputs": [ @@ -95,41 +112,58 @@ "data": [ { "name": "node-data", + "on": [ + { + "modify": "node.datum", + "trigger": "fix.length == 2", + "values": "{fx2: fix[0], fy2: fix[1]}" + } + ], "values": [ { - "fx": 80, - "fy": 21, + "fx": 15, + "fy": 57, "group": "Y", "id": 0, - "label": "n0" + "label": 0, + "x": -100, + "y": -100 }, { - "fx": 73, - "fy": 43, - "group": "W", + "fx": 99, + "fy": 45, + "group": "T", "id": 1, - "label": "n1" + "label": 1, + "x": -100, + "y": -100 }, { - "fx": 16, - "fy": 55, - "group": "X", + "fx": 44, + "fy": 92, + "group": "Y", "id": 2, - "label": "n2" + "label": 2, + "x": -100, + "y": -100 }, { - "fx": 59, - "fy": 58, + "fx": 17, + "fy": 68, "group": "U", "id": 3, - "label": "n3" + "label": 3, + "x": -100, + "y": -100 }, { - "fx": 15, - "fy": 45, - "group": "X", + "fx": 92, + "fy": 65, + "group": "V", "id": 4, - "label": "n4" + "label": 4, + "x": -100, + "y": -100 } ] }, @@ -142,27 +176,27 @@ "target": 1 }, { - "group": "T", + "group": "V", "source": 0, "target": 2 }, { - "group": "W", + "group": "X", "source": 0, "target": 3 }, { - "group": "V", + "group": "Y", "source": 0, "target": 4 }, { - "group": "T", + "group": "V", "source": 1, "target": 4 }, { - "group": "Y", + "group": "V", "source": 3, "target": 4 } @@ -200,10 +234,10 @@ "value": "pointer" }, "fx": { - "signal": "node != null && node.datum.id == datum.id && fix.length == 2 ? fix[0] : (layoutdata ? scale('xscale', datum.fx) : null)" + "signal": "datum.fx2 != -100 ? datum.fx2 : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[0] : (layoutdata ? scale('xscale', datum.fx) : null))" }, "fy": { - "signal": "node != null && node.datum.id == datum.id && fix.length == 2 ? fix[1] : (layoutdata ? scale('yscale', datum.fy) : null)" + "signal": "datum.fy2 != -100 ? datum.fy2 : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[1] : (layoutdata ? scale('yscale', datum.fy) : null))" }, "size": { "signal": "2 * nodeRadius * nodeRadius" @@ -537,6 +571,34 @@ } ], "value": false + }, + { + "name": "shift", + "on": [ + { + "events": { + "marktype": "symbol", + "type": "click" + }, + "force": true, + "update": "event.shiftKey" + } + ], + "value": false + }, + { + "name": "clicked", + "on": [ + { + "events": { + "marktype": "symbol", + "type": "click" + }, + "force": true, + "update": "datum" + } + ], + "value": null } ], "width": 500 @@ -554,7 +616,9 @@ "\n", "node_properties = {n: {\"group\": rand_group(), \n", " \"fx\": random.randint(1, 100),\n", - " \"fy\": random.randint(1, 100)}\n", + " \"fy\": random.randint(1, 100),\n", + " \"x\": -100,\n", + " \"y\": -100}\n", " for n in g.nodes()}\n", "\n", "edge_attributions = {e: {\"group\": rand_group()}\n", diff --git a/src/pyciemss/visuals/graphs.py b/src/pyciemss/visuals/graphs.py index 3ad5c756a..db6ce8a48 100644 --- a/src/pyciemss/visuals/graphs.py +++ b/src/pyciemss/visuals/graphs.py @@ -1,7 +1,7 @@ from typing import Union import networkx as nx -import vega +from . import vega def attributed_graph( diff --git a/src/pyciemss/visuals/schemas/spring_graph.vg.json b/src/pyciemss/visuals/schemas/spring_graph.vg.json index c78b6f326..a1b86ebfa 100644 --- a/src/pyciemss/visuals/schemas/spring_graph.vg.json +++ b/src/pyciemss/visuals/schemas/spring_graph.vg.json @@ -51,6 +51,28 @@ {"events": {"signal": "layoutdata"}, "update": "true"} ] + }, + { + "name": "shift", + "value": false, + "on": [ + { + "events": {"marktype": "symbol", "type": "click"}, + "update": "event.shiftKey", + "force": true + } + ] + }, + { + "name": "clicked", + "value": null, + "on": [ + { + "events": {"marktype": "symbol", "type": "click"}, + "update": "datum", + "force": true + } + ] } ], @@ -127,8 +149,8 @@ "update": { "size": {"signal": "2 * nodeRadius * nodeRadius"}, "cursor": {"value": "pointer"}, - "fy": {"signal": "node != null && node.datum.id == datum.id && fix.length == 2 ? fix[1] : (layoutdata ? scale('yscale', datum.fy) : null)"}, - "fx": {"signal": "node != null && node.datum.id == datum.id && fix.length == 2 ? fix[0] : (layoutdata ? scale('xscale', datum.fx) : null)"} + "fy": {"signal": "datum.fy2 != -100 ? datum.fy2 : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[1] : (layoutdata ? scale('yscale', datum.fy) : null))"}, + "fx": {"signal": "datum.fx2 != -100 ? datum.fx2 : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[0] : (layoutdata ? scale('xscale', datum.fx) : null))"} } } }, @@ -232,14 +254,24 @@ { "name": "node-data", "values": [ - {"id": 4, "label": "Zero", "group": "A", "fx": 2, "fy": 5}, - {"id": 1, "label": "One", "group": "A", "fx": 2, "fy": 10}, - {"id": 2, "label": "Two", "group": "B", "fx": 2, "fy": 5}, - {"id": 3, "label": "Three", "group": "B", "fx": 2, "fy": 3}, - {"id": 0, "label": "Four", "group": "C", "fx": 1, "fy": 5}, - {"id": 5, "label": "Five", "group": "C", "fx": 2, "fy": 5}, - {"id": 6, "label": "Six", "group": "C", "fx": 2, "fy": 5} - ] + {"id": 4, "label": "Zero", "group": "A", "fx": 2, "fy": 5, "fx2": -100, + "fy2": -100}, + {"id": 1, "label": "One", "group": "A", "fx": 2, "fy": 10, "fx2": -100, + "fy2": -100}, + {"id": 2, "label": "Two", "group": "B", "fx": 2, "fy": 5, "fx2": -100, + "fy2": -100}, + {"id": 3, "label": "Three", "group": "B", "fx": 2, "fy": 3, "fx2": -100, + "fy2": -100}, + {"id": 0, "label": "Four", "group": "C", "fx": 1, "fy": 5, "fx2": -100, + "fy2": -100}, + {"id": 5, "label": "Five", "group": "C", "fx": 2, "fy": 5, "fx2": -100, + "fy2": -100}, + {"id": 6, "label": "Six", "group": "C", "fx": 2, "fy": 5, "fx2": -100, + "fy2": -100} + ], + "on": [ + {"trigger": "fix.length == 2", "modify": "node.datum", "values": "{fx2: fix[0], fy2: fix[1]}"} + ] }, { "name": "link-data", From 283986def8692a545c0718fb7bbec7a0111d5099 Mon Sep 17 00:00:00 2001 From: "Oostrom, Marjolein T" Date: Fri, 15 Sep 2023 00:56:51 -0700 Subject: [PATCH 05/16] change variable name --- notebook/visual examples/Graphs.ipynb | 78 +++++++++---------- .../visuals/schemas/spring_graph.vg.json | 34 ++++---- 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/notebook/visual examples/Graphs.ipynb b/notebook/visual examples/Graphs.ipynb index 17b4d9b14..bd6e905f9 100644 --- a/notebook/visual examples/Graphs.ipynb +++ b/notebook/visual examples/Graphs.ipynb @@ -94,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 37, "id": "ece8d8e5", "metadata": {}, "outputs": [ @@ -116,54 +116,54 @@ { "modify": "node.datum", "trigger": "fix.length == 2", - "values": "{fx2: fix[0], fy2: fix[1]}" + "values": "{fixedx: fix[0], fixedy: fix[1]}" } ], "values": [ { - "fx": 15, - "fy": 57, + "fixedx": -100, + "fixedy": -100, + "fx": 47, + "fy": 61, "group": "Y", "id": 0, - "label": 0, - "x": -100, - "y": -100 + "label": 0 }, { - "fx": 99, + "fixedx": -100, + "fixedy": -100, + "fx": 98, "fy": 45, - "group": "T", + "group": "Y", "id": 1, - "label": 1, - "x": -100, - "y": -100 + "label": 1 }, { - "fx": 44, - "fy": 92, - "group": "Y", + "fixedx": -100, + "fixedy": -100, + "fx": 88, + "fy": 85, + "group": "W", "id": 2, - "label": 2, - "x": -100, - "y": -100 + "label": 2 }, { - "fx": 17, - "fy": 68, - "group": "U", + "fixedx": -100, + "fixedy": -100, + "fx": 14, + "fy": 34, + "group": "T", "id": 3, - "label": 3, - "x": -100, - "y": -100 + "label": 3 }, { - "fx": 92, - "fy": 65, - "group": "V", + "fixedx": -100, + "fixedy": -100, + "fx": 84, + "fy": 71, + "group": "Y", "id": 4, - "label": 4, - "x": -100, - "y": -100 + "label": 4 } ] }, @@ -171,7 +171,7 @@ "name": "link-data", "values": [ { - "group": "U", + "group": "W", "source": 0, "target": 1 }, @@ -186,18 +186,18 @@ "target": 3 }, { - "group": "Y", + "group": "T", "source": 0, "target": 4 }, { - "group": "V", + "group": "Y", "source": 1, "target": 4 }, { - "group": "V", - "source": 3, + "group": "T", + "source": 2, "target": 4 } ] @@ -234,10 +234,10 @@ "value": "pointer" }, "fx": { - "signal": "datum.fx2 != -100 ? datum.fx2 : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[0] : (layoutdata ? scale('xscale', datum.fx) : null))" + "signal": "datum.fixedx != -100 ? datum.fixedx : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[0] : (layoutdata ? scale('xscale', datum.fx) : null))" }, "fy": { - "signal": "datum.fy2 != -100 ? datum.fy2 : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[1] : (layoutdata ? scale('yscale', datum.fy) : null))" + "signal": "datum.fixedy != -100 ? datum.fixedy : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[1] : (layoutdata ? scale('yscale', datum.fy) : null))" }, "size": { "signal": "2 * nodeRadius * nodeRadius" @@ -617,8 +617,8 @@ "node_properties = {n: {\"group\": rand_group(), \n", " \"fx\": random.randint(1, 100),\n", " \"fy\": random.randint(1, 100),\n", - " \"x\": -100,\n", - " \"y\": -100}\n", + " \"fixedx\": -100,\n", + " \"fixedy\": -100}\n", " for n in g.nodes()}\n", "\n", "edge_attributions = {e: {\"group\": rand_group()}\n", diff --git a/src/pyciemss/visuals/schemas/spring_graph.vg.json b/src/pyciemss/visuals/schemas/spring_graph.vg.json index a1b86ebfa..02580cf18 100644 --- a/src/pyciemss/visuals/schemas/spring_graph.vg.json +++ b/src/pyciemss/visuals/schemas/spring_graph.vg.json @@ -149,8 +149,8 @@ "update": { "size": {"signal": "2 * nodeRadius * nodeRadius"}, "cursor": {"value": "pointer"}, - "fy": {"signal": "datum.fy2 != -100 ? datum.fy2 : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[1] : (layoutdata ? scale('yscale', datum.fy) : null))"}, - "fx": {"signal": "datum.fx2 != -100 ? datum.fx2 : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[0] : (layoutdata ? scale('xscale', datum.fx) : null))"} + "fy": {"signal": "datum.fixedy != -100 ? datum.fixedy : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[1] : (layoutdata ? scale('yscale', datum.fy) : null))"}, + "fx": {"signal": "datum.fixedx != -100 ? datum.fixedx : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[0] : (layoutdata ? scale('xscale', datum.fx) : null))"} } } }, @@ -254,23 +254,23 @@ { "name": "node-data", "values": [ - {"id": 4, "label": "Zero", "group": "A", "fx": 2, "fy": 5, "fx2": -100, - "fy2": -100}, - {"id": 1, "label": "One", "group": "A", "fx": 2, "fy": 10, "fx2": -100, - "fy2": -100}, - {"id": 2, "label": "Two", "group": "B", "fx": 2, "fy": 5, "fx2": -100, - "fy2": -100}, - {"id": 3, "label": "Three", "group": "B", "fx": 2, "fy": 3, "fx2": -100, - "fy2": -100}, - {"id": 0, "label": "Four", "group": "C", "fx": 1, "fy": 5, "fx2": -100, - "fy2": -100}, - {"id": 5, "label": "Five", "group": "C", "fx": 2, "fy": 5, "fx2": -100, - "fy2": -100}, - {"id": 6, "label": "Six", "group": "C", "fx": 2, "fy": 5, "fx2": -100, - "fy2": -100} + {"id": 4, "label": "Zero", "group": "A", "fx": 2, "fy": 5, "fixedx": -100, + "fixedy": -100}, + {"id": 1, "label": "One", "group": "A", "fx": 2, "fy": 10, "fixedx": -100, + "fixedy": -100}, + {"id": 2, "label": "Two", "group": "B", "fx": 2, "fy": 5, "fixedx": -100, + "fixedy": -100}, + {"id": 3, "label": "Three", "group": "B", "fx": 2, "fy": 3, "fixedx": -100, + "fixedy": -100}, + {"id": 0, "label": "Four", "group": "C", "fx": 1, "fy": 5, "fixedx": -100, + "fixedy": -100}, + {"id": 5, "label": "Five", "group": "C", "fx": 2, "fy": 5, "fixedx": -100, + "fixedy": -100}, + {"id": 6, "label": "Six", "group": "C", "fx": 2, "fy": 5, "fixedx": -100, + "fixedy": -100} ], "on": [ - {"trigger": "fix.length == 2", "modify": "node.datum", "values": "{fx2: fix[0], fy2: fix[1]}"} + {"trigger": "fix.length == 2", "modify": "node.datum", "values": "{fixedx: fix[0], fixedy: fix[1]}"} ] }, { From 5dcb66a06564b1005caf0846d249aa941fa4023b Mon Sep 17 00:00:00 2001 From: "Oostrom, Marjolein T" Date: Fri, 15 Sep 2023 08:49:42 -0700 Subject: [PATCH 06/16] unfix by double clicking --- notebook/visual examples/Graphs.ipynb | 106 +++++++++--------- .../visuals/schemas/spring_graph.vg.json | 45 ++++---- 2 files changed, 69 insertions(+), 82 deletions(-) diff --git a/notebook/visual examples/Graphs.ipynb b/notebook/visual examples/Graphs.ipynb index bd6e905f9..a5d309244 100644 --- a/notebook/visual examples/Graphs.ipynb +++ b/notebook/visual examples/Graphs.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 25, + "execution_count": 46, "id": "a1299176", "metadata": {}, "outputs": [ @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 47, "id": "5c1729f7-1b0d-4913-8048-01624c506cc5", "metadata": {}, "outputs": [], @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 48, "id": "997ef041-0312-4b83-bbe2-32a6ddfe3d6c", "metadata": {}, "outputs": [], @@ -51,18 +51,18 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 49, "id": "a4b1668c", "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] }, - "execution_count": 28, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } @@ -94,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 50, "id": "ece8d8e5", "metadata": {}, "outputs": [ @@ -117,51 +117,56 @@ "modify": "node.datum", "trigger": "fix.length == 2", "values": "{fixedx: fix[0], fixedy: fix[1]}" + }, + { + "modify": "reset", + "trigger": "reset", + "values": "{fixedx: -100, fixedy: -100}" } ], "values": [ { "fixedx": -100, "fixedy": -100, - "fx": 47, - "fy": 61, - "group": "Y", + "fx": 38, + "fy": 15, + "group": "V", "id": 0, "label": 0 }, { "fixedx": -100, "fixedy": -100, - "fx": 98, - "fy": 45, - "group": "Y", + "fx": 81, + "fy": 95, + "group": "T", "id": 1, "label": 1 }, { "fixedx": -100, "fixedy": -100, - "fx": 88, - "fy": 85, - "group": "W", + "fx": 77, + "fy": 16, + "group": "V", "id": 2, "label": 2 }, { "fixedx": -100, "fixedy": -100, - "fx": 14, - "fy": 34, - "group": "T", + "fx": 55, + "fy": 57, + "group": "U", "id": 3, "label": 3 }, { "fixedx": -100, "fixedy": -100, - "fx": 84, - "fy": 71, - "group": "Y", + "fx": 13, + "fy": 56, + "group": "X", "id": 4, "label": 4 } @@ -171,33 +176,33 @@ "name": "link-data", "values": [ { - "group": "W", + "group": "Y", "source": 0, "target": 1 }, { - "group": "V", + "group": "Y", "source": 0, "target": 2 }, { - "group": "X", + "group": "Y", "source": 0, "target": 3 }, { - "group": "T", + "group": "W", "source": 0, "target": 4 }, { - "group": "Y", + "group": "X", "source": 1, "target": 4 }, { - "group": "T", - "source": 2, + "group": "X", + "source": 3, "target": 4 } ] @@ -234,10 +239,10 @@ "value": "pointer" }, "fx": { - "signal": "datum.fixedx != -100 ? datum.fixedx : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[0] : (layoutdata ? scale('xscale', datum.fx) : null))" + "signal": "datum.fixedx != -100 ? datum.fixedx : ((layoutdata ? scale('xscale', datum.fx) : null))" }, "fy": { - "signal": "datum.fixedy != -100 ? datum.fixedy : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[1] : (layoutdata ? scale('yscale', datum.fy) : null))" + "signal": "datum.fixedy != -100 ? datum.fixedy : ((layoutdata ? scale('yscale', datum.fy) : null))" }, "size": { "signal": "2 * nodeRadius * nodeRadius" @@ -542,6 +547,17 @@ ], "value": false }, + { + "description": "Unfix node", + "name": "reset", + "on": [ + { + "events": "symbol:dblclick", + "update": "item().datum" + } + ], + "value": null + }, { "description": "Graph node most recently interacted with.", "name": "node", @@ -568,37 +584,15 @@ "signal": "layoutdata" }, "update": "true" - } - ], - "value": false - }, - { - "name": "shift", - "on": [ + }, { "events": { - "marktype": "symbol", - "type": "click" + "signal": "reset" }, - "force": true, - "update": "event.shiftKey" + "update": "true" } ], "value": false - }, - { - "name": "clicked", - "on": [ - { - "events": { - "marktype": "symbol", - "type": "click" - }, - "force": true, - "update": "datum" - } - ], - "value": null } ], "width": 500 diff --git a/src/pyciemss/visuals/schemas/spring_graph.vg.json b/src/pyciemss/visuals/schemas/spring_graph.vg.json index 02580cf18..d86013464 100644 --- a/src/pyciemss/visuals/schemas/spring_graph.vg.json +++ b/src/pyciemss/visuals/schemas/spring_graph.vg.json @@ -30,8 +30,20 @@ "update": "xy()", "force": true } + + ] + }, + { + "description": "Unfix node", + "name": "reset", "value": null, + "on": [ + { + "events": "symbol:dblclick", + "update": "item().datum" + } ] }, + { "description": "Graph node most recently interacted with.", "name": "node", "value": null, @@ -48,31 +60,10 @@ "name": "restart", "value": false, "on": [ {"events": {"signal": "fix"}, "update": "fix && fix.length"}, - {"events": {"signal": "layoutdata"}, "update": "true"} + {"events": {"signal": "layoutdata"}, "update": "true"}, + {"events": {"signal": "reset"}, "update": "true"} ] - }, - { - "name": "shift", - "value": false, - "on": [ - { - "events": {"marktype": "symbol", "type": "click"}, - "update": "event.shiftKey", - "force": true - } - ] - }, - { - "name": "clicked", - "value": null, - "on": [ - { - "events": {"marktype": "symbol", "type": "click"}, - "update": "datum", - "force": true - } - ] } ], @@ -149,8 +140,8 @@ "update": { "size": {"signal": "2 * nodeRadius * nodeRadius"}, "cursor": {"value": "pointer"}, - "fy": {"signal": "datum.fixedy != -100 ? datum.fixedy : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[1] : (layoutdata ? scale('yscale', datum.fy) : null))"}, - "fx": {"signal": "datum.fixedx != -100 ? datum.fixedx : (node != null && node.datum.id == datum.id && fix.length == 2 ? fix[0] : (layoutdata ? scale('xscale', datum.fx) : null))"} + "fy": {"signal": "datum.fixedy != -100 ? datum.fixedy : ((layoutdata ? scale('yscale', datum.fy) : null))"}, + "fx": {"signal": "datum.fixedx != -100 ? datum.fixedx : ((layoutdata ? scale('xscale', datum.fx) : null))"} } } }, @@ -270,7 +261,9 @@ "fixedy": -100} ], "on": [ - {"trigger": "fix.length == 2", "modify": "node.datum", "values": "{fixedx: fix[0], fixedy: fix[1]}"} + {"trigger": "fix.length == 2", "modify": "node.datum", "values": "{fixedx: fix[0], fixedy: fix[1]}"}, + + {"trigger": "reset", "modify": "reset", "values": "{fixedx: -100, fixedy: -100}"} ] }, { From cb4f758e13f1ef2705df42a78a815bb887484eb6 Mon Sep 17 00:00:00 2001 From: "Oostrom, Marjolein T" Date: Mon, 18 Sep 2023 13:18:39 -0700 Subject: [PATCH 07/16] add layout input as argument in function rather than just the signal boolean --- notebook/visual examples/Graphs.ipynb | 77 ++++++++----------- src/pyciemss/visuals/graphs.py | 16 ++++ .../visuals/schemas/spring_graph.vg.json | 6 +- 3 files changed, 52 insertions(+), 47 deletions(-) diff --git a/notebook/visual examples/Graphs.ipynb b/notebook/visual examples/Graphs.ipynb index a5d309244..5444dcb94 100644 --- a/notebook/visual examples/Graphs.ipynb +++ b/notebook/visual examples/Graphs.ipynb @@ -2,19 +2,10 @@ "cells": [ { "cell_type": "code", - "execution_count": 46, + "execution_count": 1, "id": "a1299176", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], + "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2" @@ -22,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 2, "id": "5c1729f7-1b0d-4913-8048-01624c506cc5", "metadata": {}, "outputs": [], @@ -41,7 +32,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 3, "id": "997ef041-0312-4b83-bbe2-32a6ddfe3d6c", "metadata": {}, "outputs": [], @@ -51,18 +42,18 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 4, "id": "a4b1668c", "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] }, - "execution_count": 49, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -94,7 +85,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 13, "id": "ece8d8e5", "metadata": {}, "outputs": [ @@ -128,8 +119,8 @@ { "fixedx": -100, "fixedy": -100, - "fx": 38, - "fy": 15, + "fx": 52, + "fy": 6, "group": "V", "id": 0, "label": 0 @@ -137,36 +128,36 @@ { "fixedx": -100, "fixedy": -100, - "fx": 81, - "fy": 95, - "group": "T", + "fx": 93, + "fy": 75, + "group": "W", "id": 1, "label": 1 }, { "fixedx": -100, "fixedy": -100, - "fx": 77, - "fy": 16, - "group": "V", + "fx": 37, + "fy": 15, + "group": "Z", "id": 2, "label": 2 }, { "fixedx": -100, "fixedy": -100, - "fx": 55, - "fy": 57, - "group": "U", + "fx": 79, + "fy": 31, + "group": "X", "id": 3, "label": 3 }, { "fixedx": -100, "fixedy": -100, - "fx": 13, - "fy": 56, - "group": "X", + "fx": 38, + "fy": 14, + "group": "Z", "id": 4, "label": 4 } @@ -181,27 +172,27 @@ "target": 1 }, { - "group": "Y", + "group": "T", "source": 0, "target": 2 }, { - "group": "Y", + "group": "Z", "source": 0, "target": 3 }, { - "group": "W", + "group": "T", "source": 0, "target": 4 }, { - "group": "X", - "source": 1, + "group": "V", + "source": 2, "target": 4 }, { - "group": "X", + "group": "Y", "source": 3, "target": 4 } @@ -239,10 +230,10 @@ "value": "pointer" }, "fx": { - "signal": "datum.fixedx != -100 ? datum.fixedx : ((layoutdata ? scale('xscale', datum.fx) : null))" + "signal": "datum.fixedx != -100 ? datum.fixedx : (layoutdata ? scale('xscale', datum.fx) : null)" }, "fy": { - "signal": "datum.fixedy != -100 ? datum.fixedy : ((layoutdata ? scale('yscale', datum.fy) : null))" + "signal": "datum.fixedy != -100 ? datum.fixedy : (layoutdata ? scale('yscale', datum.fy) : null)" }, "size": { "signal": "2 * nodeRadius * nodeRadius" @@ -525,7 +516,7 @@ "input": "checkbox" }, "name": "layoutdata", - "value": true + "value": false }, { "description": "State variable for active node fix status.", @@ -610,9 +601,7 @@ "\n", "node_properties = {n: {\"group\": rand_group(), \n", " \"fx\": random.randint(1, 100),\n", - " \"fy\": random.randint(1, 100),\n", - " \"fixedx\": -100,\n", - " \"fixedy\": -100}\n", + " \"fy\": random.randint(1, 100)}\n", " for n in g.nodes()}\n", "\n", "edge_attributions = {e: {\"group\": rand_group()}\n", @@ -622,7 +611,7 @@ "nx.set_edge_attributes(g, edge_attributions)\n", "nx.set_node_attributes(g, {k:f\"n{i}\" for i, k in enumerate(g.nodes)}, \"label\")\n", "\n", - "schema = plots.spring_force_graph(g, node_labels=\"label\")\n", + "schema = plots.spring_force_graph(g, node_labels=\"label\", input_layout = False)\n", "plots.save_schema(schema, \"_schema.json\")\n", "plots.ipy_display(schema, format=\"interactive\")" ] diff --git a/src/pyciemss/visuals/graphs.py b/src/pyciemss/visuals/graphs.py index db6ce8a48..805f3e33f 100644 --- a/src/pyciemss/visuals/graphs.py +++ b/src/pyciemss/visuals/graphs.py @@ -106,26 +106,42 @@ def attributed_graph( def spring_force_graph( graph: nx.Graph, node_labels: Union[str, None] = "label", + input_layout: bool = True, directed_graph: bool = True ) -> vega.VegaSchema: """Draw a general spring-force graph graph -- Networkx graph to draw + input_layout -- input of locations of nodes in graph as fx and fy items in data list of dictionaries labels -- If it is a string, that field name is used ('label' is the default; 'id' will give the networkx node-id). If it is None, no label is drawn. """ graph = nx.convert_node_labels_to_integers(graph, label_attribute=node_labels) gjson = nx.json_graph.node_link_data(graph) + # use -100 to signify no fixed location. values will update if node is dragged + gjson["nodes"] = [dict(item, fixedx = -100, fixedy = -100) for item in gjson["nodes"]] schema = vega.load_schema("spring_graph.vg.json") + schema["data"] = vega.replace_named_with( schema["data"], "node-data", ["values"], gjson["nodes"] ) + schema["data"] = vega.replace_named_with( schema["data"], "link-data", ["values"], gjson["links"] ) + if input_layout: + + if 'fx' not in gjson["nodes"][0].keys(): + raise ValueError(f"Cannot create graph with fixed layout without fx as key.") + if 'fy' not in gjson["nodes"][0].keys(): + raise ValueError(f"Cannot create graph with fixed layout without fy as key.") + + schema["signals"] = vega.replace_named_with( + schema["signals"], "layoutdata", ["value"], True + ) if node_labels is None: schema["marks"] = vega.delete_named(schema["marks"], "labels") diff --git a/src/pyciemss/visuals/schemas/spring_graph.vg.json b/src/pyciemss/visuals/schemas/spring_graph.vg.json index d86013464..b221da1b6 100644 --- a/src/pyciemss/visuals/schemas/spring_graph.vg.json +++ b/src/pyciemss/visuals/schemas/spring_graph.vg.json @@ -11,7 +11,7 @@ { "name": "nodeRadius", "value": 15}, { "name": "nodeCharge", "value": -80}, { "name": "linkDistance", "value": 80}, - { "name": "layoutdata", "value": true, + { "name": "layoutdata", "value": false, "bind": {"input": "checkbox"} }, { "description": "State variable for active node fix status.", @@ -140,8 +140,8 @@ "update": { "size": {"signal": "2 * nodeRadius * nodeRadius"}, "cursor": {"value": "pointer"}, - "fy": {"signal": "datum.fixedy != -100 ? datum.fixedy : ((layoutdata ? scale('yscale', datum.fy) : null))"}, - "fx": {"signal": "datum.fixedx != -100 ? datum.fixedx : ((layoutdata ? scale('xscale', datum.fx) : null))"} + "fy": {"signal": "datum.fixedy != -100 ? datum.fixedy : (layoutdata ? scale('yscale', datum.fy) : null)"}, + "fx": {"signal": "datum.fixedx != -100 ? datum.fixedx : (layoutdata ? scale('xscale', datum.fx) : null)"} } } }, From f84792bf9747a1f28e6193c55b4a4271ee807dc6 Mon Sep 17 00:00:00 2001 From: Joseph Cottam Date: Tue, 31 Oct 2023 17:00:28 -0700 Subject: [PATCH 08/16] Fixing node-color-scale reference. --- .../visuals/schemas/spring_graph.vg.json | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/pyciemss/visuals/schemas/spring_graph.vg.json b/src/pyciemss/visuals/schemas/spring_graph.vg.json index b221da1b6..be066507e 100644 --- a/src/pyciemss/visuals/schemas/spring_graph.vg.json +++ b/src/pyciemss/visuals/schemas/spring_graph.vg.json @@ -134,7 +134,7 @@ "encode": { "enter": { - "fill": {"value": "color", "field": "group"}, + "fill": {"scale": "color", "field": "group"}, "stroke": {"value": "white"} }, "update": { @@ -245,20 +245,13 @@ { "name": "node-data", "values": [ - {"id": 4, "label": "Zero", "group": "A", "fx": 2, "fy": 5, "fixedx": -100, - "fixedy": -100}, - {"id": 1, "label": "One", "group": "A", "fx": 2, "fy": 10, "fixedx": -100, - "fixedy": -100}, - {"id": 2, "label": "Two", "group": "B", "fx": 2, "fy": 5, "fixedx": -100, - "fixedy": -100}, - {"id": 3, "label": "Three", "group": "B", "fx": 2, "fy": 3, "fixedx": -100, - "fixedy": -100}, - {"id": 0, "label": "Four", "group": "C", "fx": 1, "fy": 5, "fixedx": -100, - "fixedy": -100}, - {"id": 5, "label": "Five", "group": "C", "fx": 2, "fy": 5, "fixedx": -100, - "fixedy": -100}, - {"id": 6, "label": "Six", "group": "C", "fx": 2, "fy": 5, "fixedx": -100, - "fixedy": -100} + {"id": 4, "label": "Zero", "group": "A", "fx": 2, "fy": 5, "fixedx": -100, "fixedy": -100}, + {"id": 1, "label": "One", "group": "A", "fx": 2, "fy": 10, "fixedx": -100, "fixedy": -100}, + {"id": 2, "label": "Two", "group": "B", "fx": 2, "fy": 5, "fixedx": -100, "fixedy": -100}, + {"id": 3, "label": "Three", "group": "B", "fx": 2, "fy": 3, "fixedx": -100, "fixedy": -100}, + {"id": 0, "label": "Four", "group": "C", "fx": 1, "fy": 5, "fixedx": -100, "fixedy": -100}, + {"id": 5, "label": "Five", "group": "C", "fx": 2, "fy": 5, "fixedx": -100, "fixedy": -100}, + {"id": 6, "label": "Six", "group": "C", "fx": 2, "fy": 5, "fixedx": -100, "fixedy": -100} ], "on": [ {"trigger": "fix.length == 2", "modify": "node.datum", "values": "{fixedx: fix[0], fixedy: fix[1]}"}, From d2849fb304371870ee0bb366b605c7e7f172ae18 Mon Sep 17 00:00:00 2001 From: Joseph Cottam Date: Tue, 31 Oct 2023 17:11:46 -0700 Subject: [PATCH 09/16] Graph layout passed in as dictionary-of-points (networkx convention) --- notebook/visual examples/Graphs.ipynb | 635 ++++++++++++++++++++++++-- src/pyciemss/visuals/graphs.py | 40 +- 2 files changed, 619 insertions(+), 56 deletions(-) diff --git a/notebook/visual examples/Graphs.ipynb b/notebook/visual examples/Graphs.ipynb index 5444dcb94..09213492a 100644 --- a/notebook/visual examples/Graphs.ipynb +++ b/notebook/visual examples/Graphs.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "a1299176", "metadata": {}, "outputs": [], @@ -13,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "5c1729f7-1b0d-4913-8048-01624c506cc5", "metadata": {}, "outputs": [], @@ -32,7 +32,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "997ef041-0312-4b83-bbe2-32a6ddfe3d6c", "metadata": {}, "outputs": [], @@ -42,18 +42,18 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "a4b1668c", "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] }, - "execution_count": 4, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -85,7 +85,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 56, "id": "ece8d8e5", "metadata": {}, "outputs": [ @@ -119,45 +119,45 @@ { "fixedx": -100, "fixedy": -100, - "fx": 52, - "fy": 6, - "group": "V", + "fx": -0.15087741828450663, + "fy": -0.07087939983650203, + "group": "T", "id": 0, "label": 0 }, { "fixedx": -100, "fixedy": -100, - "fx": 93, - "fy": 75, - "group": "W", + "fx": 0.025875993803958518, + "fy": 0.7506394209248575, + "group": "Y", "id": 1, "label": 1 }, { "fixedx": -100, "fixedy": -100, - "fx": 37, - "fy": 15, - "group": "Z", + "fx": 0.5942795630479355, + "fy": -0.45931613507821184, + "group": "V", "id": 2, "label": 2 }, { "fixedx": -100, "fixedy": -100, - "fx": 79, - "fy": 31, - "group": "X", + "fx": -1, + "fy": -0.469757931425798, + "group": "T", "id": 3, "label": 3 }, { "fixedx": -100, "fixedy": -100, - "fx": 38, - "fy": 14, - "group": "Z", + "fx": 0.5307218614326124, + "fy": 0.24931404541565502, + "group": "T", "id": 4, "label": 4 } @@ -167,33 +167,33 @@ "name": "link-data", "values": [ { - "group": "Y", + "group": "W", "source": 0, "target": 1 }, { - "group": "T", + "group": "U", "source": 0, "target": 2 }, { - "group": "Z", + "group": "Y", "source": 0, "target": 3 }, { - "group": "T", + "group": "X", "source": 0, "target": 4 }, { "group": "V", - "source": 2, + "source": 1, "target": 4 }, { - "group": "Y", - "source": 3, + "group": "W", + "source": 2, "target": 4 } ] @@ -219,7 +219,7 @@ "enter": { "fill": { "field": "group", - "value": "color" + "scale": "color" }, "stroke": { "value": "white" @@ -516,7 +516,7 @@ "input": "checkbox" }, "name": "layoutdata", - "value": false + "value": true }, { "description": "State variable for active node fix status.", @@ -599,10 +599,9 @@ " possible = \"TUVWXYZ\"\n", " return random.sample(possible, 1)[0]\n", "\n", - "node_properties = {n: {\"group\": rand_group(), \n", - " \"fx\": random.randint(1, 100),\n", - " \"fy\": random.randint(1, 100)}\n", - " for n in g.nodes()}\n", + "node_properties = {n: {\"group\": rand_group()} for n in g.nodes()}\n", + "\n", + "pos = nx.fruchterman_reingold_layout(g)\n", "\n", "edge_attributions = {e: {\"group\": rand_group()}\n", " for e in g.edges()}\n", @@ -611,10 +610,572 @@ "nx.set_edge_attributes(g, edge_attributions)\n", "nx.set_node_attributes(g, {k:f\"n{i}\" for i, k in enumerate(g.nodes)}, \"label\")\n", "\n", - "schema = plots.spring_force_graph(g, node_labels=\"label\", input_layout = False)\n", + "schema = plots.spring_force_graph(g, node_labels=\"label\", layout=pos)\n", "plots.save_schema(schema, \"_schema.json\")\n", "plots.ipy_display(schema, format=\"interactive\")" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "212e5723", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "29942999", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "application/vnd.vega.v5+json": { + "$schema": "https://vega.github.io/schema/vega/v5.json", + "data": [ + { + "name": "node-data", + "on": [ + { + "modify": "node.datum", + "trigger": "fix.length == 2", + "values": "{fixedx: fix[0], fixedy: fix[1]}" + }, + { + "modify": "reset", + "trigger": "reset", + "values": "{fixedx: -100, fixedy: -100}" + } + ], + "values": [ + { + "fixedx": -100, + "fixedy": -100, + "group": "U", + "id": 0, + "label": 0 + }, + { + "fixedx": -100, + "fixedy": -100, + "group": "X", + "id": 1, + "label": 1 + }, + { + "fixedx": -100, + "fixedy": -100, + "group": "Z", + "id": 2, + "label": 2 + }, + { + "fixedx": -100, + "fixedy": -100, + "group": "U", + "id": 3, + "label": 3 + }, + { + "fixedx": -100, + "fixedy": -100, + "group": "T", + "id": 4, + "label": 4 + } + ] + }, + { + "name": "link-data", + "values": [ + { + "group": "Y", + "source": 0, + "target": 1 + }, + { + "group": "W", + "source": 0, + "target": 2 + }, + { + "group": "T", + "source": 0, + "target": 3 + }, + { + "group": "T", + "source": 0, + "target": 4 + }, + { + "group": "Z", + "source": 1, + "target": 4 + }, + { + "group": "X", + "source": 3, + "target": 4 + } + ] + } + ], + "description": "A node-link diagram with force-directed layout.", + "height": 500, + "legends": [ + { + "stroke": "color", + "symbolType": "stroke", + "title": "Group" + }, + { + "stroke": "colorlink", + "symbolType": "stroke", + "title": "Link Group" + } + ], + "marks": [ + { + "encode": { + "enter": { + "fill": { + "field": "group", + "scale": "color" + }, + "stroke": { + "value": "black" + } + }, + "update": { + "cursor": { + "value": "pointer" + }, + "fx": { + "signal": "datum.fixedx != -100 ? datum.fixedx : (layoutdata ? scale('xscale', datum.fx) : null)" + }, + "fy": { + "signal": "datum.fixedy != -100 ? datum.fixedy : (layoutdata ? scale('yscale', datum.fy) : null)" + }, + "size": { + "signal": "2 * nodeRadius * nodeRadius" + } + } + }, + "from": { + "data": "node-data" + }, + "name": "nodes", + "transform": [ + { + "forces": [ + { + "force": "center", + "x": { + "signal": "cx" + }, + "y": { + "signal": "cy" + } + }, + { + "force": "collide", + "radius": { + "signal": "nodeRadius" + } + }, + { + "force": "nbody", + "strength": { + "signal": "nodeCharge" + } + }, + { + "distance": { + "signal": "linkDistance" + }, + "force": "link", + "links": "link-data" + } + ], + "iterations": 300, + "restart": { + "signal": "restart" + }, + "signal": "force", + "static": true, + "type": "force" + } + ], + "type": "symbol", + "zindex": 1 + }, + { + "encode": { + "enter": { + "align": { + "value": "center" + }, + "baseline": { + "value": "middle" + }, + "fill": { + "value": "black" + }, + "fontSize": { + "value": 10 + }, + "text": { + "field": "datum.label" + } + }, + "update": { + "x": { + "field": "x" + }, + "y": { + "field": "y" + } + } + }, + "from": { + "data": "nodes" + }, + "interactive": false, + "name": "labels", + "transform": [ + { + "anchor": [ + "top", + "bottom", + "right", + "left" + ], + "avoidMarks": [ + "nodes" + ], + "offset": [ + 1 + ], + "size": { + "signal": "[width + 60, height]" + }, + "type": "label" + } + ], + "type": "text", + "zindex": 2 + }, + { + "encode": { + "update": { + "stroke": { + "field": "group", + "scale": "colorlink" + }, + "strokeWidth": { + "value": 0.5 + } + } + }, + "from": { + "data": "link-data" + }, + "interactive": false, + "transform": [ + { + "require": { + "signal": "force" + }, + "shape": "line", + "sourceX": "datum.source.x", + "sourceY": "datum.source.y", + "targetX": "datum.target.x", + "targetY": "datum.target.y", + "type": "linkpath" + } + ], + "type": "path" + }, + { + "encode": { + "enter": { + "fill": { + "field": "group", + "scale": "colorlink" + }, + "shape": { + "value": "triangle-right" + }, + "size": { + "value": 40 + }, + "stroke": { + "field": "group", + "scale": "colorlink" + } + }, + "hover": { + "opacity": { + "value": 1 + } + }, + "update": { + "x": { + "field": "target.x" + }, + "y": { + "field": "target.y" + } + } + }, + "from": { + "data": "link-data" + }, + "name": "arrows", + "transform": [ + { + "as": "tan", + "expr": "atan2((datum.datum.target.y-datum.datum.source.y),(datum.datum.target.x-datum.datum.source.x))", + "type": "formula" + }, + { + "as": "angle", + "expr": "datum.tan*180/PI", + "type": "formula" + }, + { + "as": "y", + "expr": "datum.datum.target.y - nodeRadius*sin(datum.tan)", + "type": "formula" + }, + { + "as": "x", + "expr": "datum.datum.target.x - nodeRadius*cos(datum.tan)", + "type": "formula" + } + ], + "type": "symbol", + "zindex": { + "value": 40 + } + } + ], + "padding": 0, + "scales": [ + { + "domain": { + "data": "node-data", + "field": "group" + }, + "name": "color", + "range": { + "scheme": "category20c" + }, + "type": "ordinal" + }, + { + "domain": { + "data": "link-data", + "field": "group" + }, + "name": "colorlink", + "range": { + "scheme": "category20c" + }, + "type": "ordinal" + }, + { + "domain": { + "data": "node-data", + "field": "fx" + }, + "name": "xscale", + "range": [ + 10, + { + "signal": "width - 10" + } + ] + }, + { + "domain": { + "data": "node-data", + "field": "fy" + }, + "name": "yscale", + "range": [ + 10, + { + "signal": "height - 10" + } + ] + } + ], + "signals": [ + { + "name": "cx", + "update": "width / 2" + }, + { + "name": "cy", + "update": "height / 2" + }, + { + "name": "nodeRadius", + "value": 15 + }, + { + "name": "nodeCharge", + "value": -80 + }, + { + "name": "linkDistance", + "value": 80 + }, + { + "bind": { + "input": "checkbox" + }, + "name": "layoutdata", + "value": false + }, + { + "description": "State variable for active node fix status.", + "name": "fix", + "on": [ + { + "events": "symbol:mouseout[!event.buttons], window:mouseup", + "update": "false" + }, + { + "events": "symbol:mouseover", + "update": "fix || true" + }, + { + "events": "[symbol:mousedown, window:mouseup] > window:mousemove!", + "force": true, + "update": "xy()" + } + ], + "value": false + }, + { + "description": "Unfix node", + "name": "reset", + "on": [ + { + "events": "symbol:dblclick", + "update": "item().datum" + } + ], + "value": null + }, + { + "description": "Graph node most recently interacted with.", + "name": "node", + "on": [ + { + "events": "symbol:mouseover", + "update": "fix === true ? item() : node" + } + ], + "value": null + }, + { + "description": "Flag to restart Force simulation upon data changes.", + "name": "restart", + "on": [ + { + "events": { + "signal": "fix" + }, + "update": "fix && fix.length" + }, + { + "events": { + "signal": "layoutdata" + }, + "update": "true" + }, + { + "events": { + "signal": "reset" + }, + "update": "true" + } + ], + "value": false + } + ], + "width": 500 + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "g = nx.generators.barabasi_albert_graph(5, 3)\n", + "def rand_group():\n", + " possible = \"TUVWXYZ\"\n", + " return random.sample(possible, 1)[0]\n", + "\n", + "node_properties = {n: {\"group\": rand_group()}\n", + " for n in g.nodes()}\n", + "\n", + "edge_attributions = {e: {\"group\": rand_group()}\n", + " for e in g.edges()}\n", + "\n", + "nx.set_node_attributes(g, node_properties)\n", + "nx.set_edge_attributes(g, edge_attributions)\n", + "nx.set_node_attributes(g, {k:f\"n{i}\" for i, k in enumerate(g.nodes)}, \"label\")\n", + "\n", + "schema = plots.spring_force_graph(g, node_labels=\"label\", input_layout = False)\n", + "plots.save_schema(schema, \"_schema.json\")\n", + "plots.ipy_display(schema, format=\"interactive\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "7f1456f7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{0: {'group': 'X'},\n", + " 1: {'group': 'Z'},\n", + " 2: {'group': 'T'},\n", + " 3: {'group': 'T'},\n", + " 4: {'group': 'W'}}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "node_properties" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dec992e7", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -633,7 +1194,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.11" + "version": "3.11.4" } }, "nbformat": 4, diff --git a/src/pyciemss/visuals/graphs.py b/src/pyciemss/visuals/graphs.py index 805f3e33f..ab2b0a108 100644 --- a/src/pyciemss/visuals/graphs.py +++ b/src/pyciemss/visuals/graphs.py @@ -1,4 +1,5 @@ -from typing import Union +from typing import Union, Optional +from numbers import Number import networkx as nx from . import vega @@ -104,10 +105,10 @@ def attributed_graph( def spring_force_graph( - graph: nx.Graph, + graph: nx.Graph, node_labels: Union[str, None] = "label", - input_layout: bool = True, - directed_graph: bool = True + layout: Optional[dict[any, (Number, Number)]] = None, + directed_graph: bool = True, ) -> vega.VegaSchema: """Draw a general spring-force graph @@ -117,14 +118,25 @@ def spring_force_graph( If it is None, no label is drawn. """ graph = nx.convert_node_labels_to_integers(graph, label_attribute=node_labels) - gjson = nx.json_graph.node_link_data(graph) + schema = vega.load_schema("spring_graph.vg.json") + # use -100 to signify no fixed location. values will update if node is dragged - gjson["nodes"] = [dict(item, fixedx = -100, fixedy = -100) for item in gjson["nodes"]] + gjson["nodes"] = [dict(item, fixedx=-100, fixedy=-100) for item in gjson["nodes"]] - schema = vega.load_schema("spring_graph.vg.json") + if layout: + + def _layout_get(id): + return dict(zip(["fx", "fy"], layout.get(id, (None, None)))) + + gjson["nodes"] = [ + {**item, **_layout_get(item[node_labels])} for item in gjson["nodes"] + ] + + schema["signals"] = vega.replace_named_with( + schema["signals"], "layoutdata", ["value"], True + ) - schema["data"] = vega.replace_named_with( schema["data"], "node-data", ["values"], gjson["nodes"] ) @@ -132,16 +144,6 @@ def spring_force_graph( schema["data"] = vega.replace_named_with( schema["data"], "link-data", ["values"], gjson["links"] ) - if input_layout: - - if 'fx' not in gjson["nodes"][0].keys(): - raise ValueError(f"Cannot create graph with fixed layout without fx as key.") - if 'fy' not in gjson["nodes"][0].keys(): - raise ValueError(f"Cannot create graph with fixed layout without fy as key.") - - schema["signals"] = vega.replace_named_with( - schema["signals"], "layoutdata", ["value"], True - ) if node_labels is None: schema["marks"] = vega.delete_named(schema["marks"], "labels") @@ -152,4 +154,4 @@ def spring_force_graph( if not directed_graph: schema["marks"] = vega.delete_named(schema["marks"], "arrows") - return schema \ No newline at end of file + return schema From 7ab12b9777d37cc992c93b29a23efa0ab339397a Mon Sep 17 00:00:00 2001 From: Joseph Cottam Date: Tue, 31 Oct 2023 21:45:40 -0700 Subject: [PATCH 10/16] Removed 'layoutdata' flag --- src/pyciemss/visuals/graphs.py | 22 +++++++++------- .../visuals/schemas/spring_graph.vg.json | 26 ++++++++----------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/pyciemss/visuals/graphs.py b/src/pyciemss/visuals/graphs.py index ab2b0a108..c34cf6c6f 100644 --- a/src/pyciemss/visuals/graphs.py +++ b/src/pyciemss/visuals/graphs.py @@ -117,26 +117,28 @@ def spring_force_graph( labels -- If it is a string, that field name is used ('label' is the default; 'id' will give the networkx node-id). If it is None, no label is drawn. """ + + def _layout_get(id): + x, y = layout.get(id, (None, None)) + return dict(zip(["inputX", "inputY", "fx", "fy"], [-100, -100, x, y])) + graph = nx.convert_node_labels_to_integers(graph, label_attribute=node_labels) gjson = nx.json_graph.node_link_data(graph) schema = vega.load_schema("spring_graph.vg.json") - # use -100 to signify no fixed location. values will update if node is dragged - gjson["nodes"] = [dict(item, fixedx=-100, fixedy=-100) for item in gjson["nodes"]] - - if layout: + # TODO: + # -- Set 'inputX' and 'inputY' to original layout + # -- Copy 'fx' and 'fy' if present in 'inputX' and 'inputY' OR set based on user action + # -- Compute force-directed layout for remaning nodes - def _layout_get(id): - return dict(zip(["fx", "fy"], layout.get(id, (None, None)))) + # # use -100 to signify no fixed location. values will update if node is dragged + # gjson["nodes"] = [dict(item, inputX=-100, inputY=-100) for item in gjson["nodes"]] + if layout: gjson["nodes"] = [ {**item, **_layout_get(item[node_labels])} for item in gjson["nodes"] ] - schema["signals"] = vega.replace_named_with( - schema["signals"], "layoutdata", ["value"], True - ) - schema["data"] = vega.replace_named_with( schema["data"], "node-data", ["values"], gjson["nodes"] ) diff --git a/src/pyciemss/visuals/schemas/spring_graph.vg.json b/src/pyciemss/visuals/schemas/spring_graph.vg.json index be066507e..9f1e4cd52 100644 --- a/src/pyciemss/visuals/schemas/spring_graph.vg.json +++ b/src/pyciemss/visuals/schemas/spring_graph.vg.json @@ -11,8 +11,6 @@ { "name": "nodeRadius", "value": 15}, { "name": "nodeCharge", "value": -80}, { "name": "linkDistance", "value": 80}, - { "name": "layoutdata", "value": false, - "bind": {"input": "checkbox"} }, { "description": "State variable for active node fix status.", "name": "fix", "value": false, @@ -60,7 +58,6 @@ "name": "restart", "value": false, "on": [ {"events": {"signal": "fix"}, "update": "fix && fix.length"}, - {"events": {"signal": "layoutdata"}, "update": "true"}, {"events": {"signal": "reset"}, "update": "true"} ] @@ -140,8 +137,8 @@ "update": { "size": {"signal": "2 * nodeRadius * nodeRadius"}, "cursor": {"value": "pointer"}, - "fy": {"signal": "datum.fixedy != -100 ? datum.fixedy : (layoutdata ? scale('yscale', datum.fy) : null)"}, - "fx": {"signal": "datum.fixedx != -100 ? datum.fixedx : (layoutdata ? scale('xscale', datum.fx) : null)"} + "fy": {"signal": "datum.inputY != -100 ? datum.inputY : scale('yscale', datum.fy)"}, + "fx": {"signal": "datum.inputX != -100 ? datum.inputX : scale('xscale', datum.fx)"} } } }, @@ -245,18 +242,17 @@ { "name": "node-data", "values": [ - {"id": 4, "label": "Zero", "group": "A", "fx": 2, "fy": 5, "fixedx": -100, "fixedy": -100}, - {"id": 1, "label": "One", "group": "A", "fx": 2, "fy": 10, "fixedx": -100, "fixedy": -100}, - {"id": 2, "label": "Two", "group": "B", "fx": 2, "fy": 5, "fixedx": -100, "fixedy": -100}, - {"id": 3, "label": "Three", "group": "B", "fx": 2, "fy": 3, "fixedx": -100, "fixedy": -100}, - {"id": 0, "label": "Four", "group": "C", "fx": 1, "fy": 5, "fixedx": -100, "fixedy": -100}, - {"id": 5, "label": "Five", "group": "C", "fx": 2, "fy": 5, "fixedx": -100, "fixedy": -100}, - {"id": 6, "label": "Six", "group": "C", "fx": 2, "fy": 5, "fixedx": -100, "fixedy": -100} + {"id": 4, "label": "Zero", "group": "A", "fx": 2, "fy": 5, "inputX": -100, "inputY": -100}, + {"id": 1, "label": "One", "group": "A", "fx": 2, "fy": 10, "inputX": -100, "inputY": -100}, + {"id": 2, "label": "Two", "group": "B", "fx": 2, "fy": 5, "inputX": -100, "inputY": -100}, + {"id": 3, "label": "Three", "group": "B", "fx": 2, "fy": 3, "inputX": -100, "inputY": -100}, + {"id": 0, "label": "Four", "group": "C", "fx": 1, "fy": 5, "inputX": -100, "inputY": -100}, + {"id": 5, "label": "Five", "group": "C", "fx": 2, "fy": 5, "inputX": -100, "inputY": -100}, + {"id": 6, "label": "Six", "group": "C", "fx": 2, "fy": 5, "inputX": -100, "inputY": -100} ], "on": [ - {"trigger": "fix.length == 2", "modify": "node.datum", "values": "{fixedx: fix[0], fixedy: fix[1]}"}, - - {"trigger": "reset", "modify": "reset", "values": "{fixedx: -100, fixedy: -100}"} + {"trigger": "fix.length == 2", "modify": "node.datum", "values": "{inputX: fix[0], inputY: fix[1]}"}, + {"trigger": "reset", "modify": "reset", "values": "{inputX: -100, inputY: -100}"} ] }, { From 0026b720430748311c0aa09a31489d7013f600e1 Mon Sep 17 00:00:00 2001 From: Joseph Cottam Date: Tue, 31 Oct 2023 23:07:29 -0700 Subject: [PATCH 11/16] retaining input x/y more clearly --- src/pyciemss/visuals/graphs.py | 5 +--- .../visuals/schemas/spring_graph.vg.json | 26 +++++++++---------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/pyciemss/visuals/graphs.py b/src/pyciemss/visuals/graphs.py index c34cf6c6f..c3eaedae5 100644 --- a/src/pyciemss/visuals/graphs.py +++ b/src/pyciemss/visuals/graphs.py @@ -120,7 +120,7 @@ def spring_force_graph( def _layout_get(id): x, y = layout.get(id, (None, None)) - return dict(zip(["inputX", "inputY", "fx", "fy"], [-100, -100, x, y])) + return dict(zip(["inputX", "inputY", "fx", "fy"], [x, y, None, None])) graph = nx.convert_node_labels_to_integers(graph, label_attribute=node_labels) gjson = nx.json_graph.node_link_data(graph) @@ -131,9 +131,6 @@ def _layout_get(id): # -- Copy 'fx' and 'fy' if present in 'inputX' and 'inputY' OR set based on user action # -- Compute force-directed layout for remaning nodes - # # use -100 to signify no fixed location. values will update if node is dragged - # gjson["nodes"] = [dict(item, inputX=-100, inputY=-100) for item in gjson["nodes"]] - if layout: gjson["nodes"] = [ {**item, **_layout_get(item[node_labels])} for item in gjson["nodes"] diff --git a/src/pyciemss/visuals/schemas/spring_graph.vg.json b/src/pyciemss/visuals/schemas/spring_graph.vg.json index 9f1e4cd52..68c87c98b 100644 --- a/src/pyciemss/visuals/schemas/spring_graph.vg.json +++ b/src/pyciemss/visuals/schemas/spring_graph.vg.json @@ -80,12 +80,12 @@ }, { "name": "xscale", - "domain": {"data": "node-data", "field": "fx"}, + "domain": {"data": "node-data", "field": "inputX"}, "range": [10, {"signal": "width - 10"}] }, { "name": "yscale", - "domain": {"data": "node-data", "field": "fy"}, + "domain": {"data": "node-data", "field": "inputY"}, "range": [10, {"signal": "height - 10"}] } ], @@ -137,8 +137,8 @@ "update": { "size": {"signal": "2 * nodeRadius * nodeRadius"}, "cursor": {"value": "pointer"}, - "fy": {"signal": "datum.inputY != -100 ? datum.inputY : scale('yscale', datum.fy)"}, - "fx": {"signal": "datum.inputX != -100 ? datum.inputX : scale('xscale', datum.fx)"} + "fx": {"signal": "datum.fx == null ? scale('xscale', datum.inputX) : datum.fx"}, + "fy": {"signal": "datum.fy == null ? scale('yscale', datum.inputY) : datum.fy"} } } }, @@ -242,17 +242,17 @@ { "name": "node-data", "values": [ - {"id": 4, "label": "Zero", "group": "A", "fx": 2, "fy": 5, "inputX": -100, "inputY": -100}, - {"id": 1, "label": "One", "group": "A", "fx": 2, "fy": 10, "inputX": -100, "inputY": -100}, - {"id": 2, "label": "Two", "group": "B", "fx": 2, "fy": 5, "inputX": -100, "inputY": -100}, - {"id": 3, "label": "Three", "group": "B", "fx": 2, "fy": 3, "inputX": -100, "inputY": -100}, - {"id": 0, "label": "Four", "group": "C", "fx": 1, "fy": 5, "inputX": -100, "inputY": -100}, - {"id": 5, "label": "Five", "group": "C", "fx": 2, "fy": 5, "inputX": -100, "inputY": -100}, - {"id": 6, "label": "Six", "group": "C", "fx": 2, "fy": 5, "inputX": -100, "inputY": -100} + {"id": 4, "label": "Zero", "group": "A", "inputX": 2, "inputY": 5, "fx": null, "fy": null}, + {"id": 1, "label": "One", "group": "A", "inputX": 2, "inputY": 10, "fx": null, "fy": null}, + {"id": 2, "label": "Two", "group": "B", "inputX": 2, "inputY": 5, "fx": null, "fy": null}, + {"id": 3, "label": "Three", "group": "B", "inputX": 2, "inputY": 3, "fx": null, "fy": null}, + {"id": 0, "label": "Four", "group": "C", "inputX": 1, "inputY": 5, "fx": null, "fy": null}, + {"id": 5, "label": "Five", "group": "C", "inputX": 2, "inputY": 5, "fx": null, "fy": null}, + {"id": 6, "label": "Six", "group": "C", "inputX": 2, "inputY": 5, "fx": null, "fy": null} ], "on": [ - {"trigger": "fix.length == 2", "modify": "node.datum", "values": "{inputX: fix[0], inputY: fix[1]}"}, - {"trigger": "reset", "modify": "reset", "values": "{inputX: -100, inputY: -100}"} + {"trigger": "fix.length == 2", "modify": "node.datum", "values": "{fx: fix[0], fy: fix[1]}"}, + {"trigger": "reset", "modify": "reset", "values": "{fx: null, fy: null}"} ] }, { From 449faf064c779b78bd19a5d06f95aca7bf4fde8e Mon Sep 17 00:00:00 2001 From: Joseph Cottam Date: Tue, 31 Oct 2023 23:07:52 -0700 Subject: [PATCH 12/16] whitespace cleanup --- .../visuals/schemas/spring_graph.vg.json | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/pyciemss/visuals/schemas/spring_graph.vg.json b/src/pyciemss/visuals/schemas/spring_graph.vg.json index 68c87c98b..516870fbe 100644 --- a/src/pyciemss/visuals/schemas/spring_graph.vg.json +++ b/src/pyciemss/visuals/schemas/spring_graph.vg.json @@ -109,10 +109,7 @@ "name": "nodes", "type": "symbol", "zindex": 1, - "from": {"data": "node-data"}, - - "transform": [ { "type": "force", @@ -128,7 +125,6 @@ ] } ], - "encode": { "enter": { "fill": {"scale": "color", "field": "group"}, @@ -149,16 +145,16 @@ "zindex": 2, "interactive": false, "transform": [ - { - "type": "label", - "avoidMarks": ["nodes"], - "anchor": ["top", "bottom", "right", "left"], - "offset": [1], - "size": { - "signal": "[width + 60, height]" - } - } - ], + { + "type": "label", + "avoidMarks": ["nodes"], + "anchor": ["top", "bottom", "right", "left"], + "offset": [1], + "size": { + "signal": "[width + 60, height]" + } + } + ], "encode": { "enter": { "fill": {"value": "black"}, From 0e340b8e3858ac3e8198b24b1ea25c0344d30337 Mon Sep 17 00:00:00 2001 From: Joseph Cottam Date: Wed, 1 Nov 2023 15:16:06 -0700 Subject: [PATCH 13/16] Improved names for x/y coordinate values. --- notebook/visual examples/Graphs.ipynb | 142 +++++++----------- src/pyciemss/visuals/graphs.py | 5 - .../visuals/schemas/spring_graph.vg.json | 22 +-- 3 files changed, 64 insertions(+), 105 deletions(-) diff --git a/notebook/visual examples/Graphs.ipynb b/notebook/visual examples/Graphs.ipynb index 09213492a..8a896adef 100644 --- a/notebook/visual examples/Graphs.ipynb +++ b/notebook/visual examples/Graphs.ipynb @@ -85,7 +85,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 66, "id": "ece8d8e5", "metadata": {}, "outputs": [ @@ -107,58 +107,58 @@ { "modify": "node.datum", "trigger": "fix.length == 2", - "values": "{fixedx: fix[0], fixedy: fix[1]}" + "values": "{inputX: fix[0], inputY: fix[1]}" }, { "modify": "reset", "trigger": "reset", - "values": "{fixedx: -100, fixedy: -100}" + "values": "{inputX: -100, inputY: -100}" } ], "values": [ { - "fixedx": -100, - "fixedy": -100, - "fx": -0.15087741828450663, - "fy": -0.07087939983650203, - "group": "T", + "fx": 0.15086988145661365, + "fy": 0.08835978439283941, + "group": "Y", "id": 0, + "inputX": -100, + "inputY": -100, "label": 0 }, { - "fixedx": -100, - "fixedy": -100, - "fx": 0.025875993803958518, - "fy": 0.7506394209248575, - "group": "Y", + "fx": 0.04520905615931008, + "fy": -0.787027043559539, + "group": "X", "id": 1, + "inputX": -100, + "inputY": -100, "label": 1 }, { - "fixedx": -100, - "fixedy": -100, - "fx": 0.5942795630479355, - "fy": -0.45931613507821184, + "fx": 1, + "fy": 0.5856695612937016, "group": "V", "id": 2, + "inputX": -100, + "inputY": -100, "label": 2 }, { - "fixedx": -100, - "fixedy": -100, - "fx": -1, - "fy": -0.469757931425798, - "group": "T", + "fx": -0.6643091515775201, + "fy": 0.4244389788997423, + "group": "X", "id": 3, + "inputX": -100, + "inputY": -100, "label": 3 }, { - "fixedx": -100, - "fixedy": -100, - "fx": 0.5307218614326124, - "fy": 0.24931404541565502, - "group": "T", + "fx": -0.5317697860384047, + "fy": -0.31144128102674434, + "group": "U", "id": 4, + "inputX": -100, + "inputY": -100, "label": 4 } ] @@ -167,7 +167,7 @@ "name": "link-data", "values": [ { - "group": "W", + "group": "T", "source": 0, "target": 1 }, @@ -177,23 +177,23 @@ "target": 2 }, { - "group": "Y", + "group": "U", "source": 0, "target": 3 }, { - "group": "X", + "group": "W", "source": 0, "target": 4 }, { - "group": "V", + "group": "X", "source": 1, "target": 4 }, { - "group": "W", - "source": 2, + "group": "V", + "source": 3, "target": 4 } ] @@ -230,10 +230,10 @@ "value": "pointer" }, "fx": { - "signal": "datum.fixedx != -100 ? datum.fixedx : (layoutdata ? scale('xscale', datum.fx) : null)" + "signal": "datum.inputX != -100 ? datum.inputX : scale('xscale', datum.fx)" }, "fy": { - "signal": "datum.fixedy != -100 ? datum.fixedy : (layoutdata ? scale('yscale', datum.fy) : null)" + "signal": "datum.inputY != -100 ? datum.inputY : scale('yscale', datum.fy)" }, "size": { "signal": "2 * nodeRadius * nodeRadius" @@ -511,13 +511,6 @@ "name": "linkDistance", "value": 80 }, - { - "bind": { - "input": "checkbox" - }, - "name": "layoutdata", - "value": true - }, { "description": "State variable for active node fix status.", "name": "fix", @@ -570,12 +563,6 @@ }, "update": "fix && fix.length" }, - { - "events": { - "signal": "layoutdata" - }, - "update": "true" - }, { "events": { "signal": "reset" @@ -625,7 +612,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 65, "id": "29942999", "metadata": {}, "outputs": [ @@ -647,47 +634,37 @@ { "modify": "node.datum", "trigger": "fix.length == 2", - "values": "{fixedx: fix[0], fixedy: fix[1]}" + "values": "{inputX: fix[0], inputY: fix[1]}" }, { "modify": "reset", "trigger": "reset", - "values": "{fixedx: -100, fixedy: -100}" + "values": "{inputX: -100, inputY: -100}" } ], "values": [ { - "fixedx": -100, - "fixedy": -100, - "group": "U", + "group": "Y", "id": 0, "label": 0 }, { - "fixedx": -100, - "fixedy": -100, - "group": "X", + "group": "T", "id": 1, "label": 1 }, { - "fixedx": -100, - "fixedy": -100, - "group": "Z", + "group": "Y", "id": 2, "label": 2 }, { - "fixedx": -100, - "fixedy": -100, - "group": "U", + "group": "Z", "id": 3, "label": 3 }, { - "fixedx": -100, - "fixedy": -100, - "group": "T", + "group": "X", "id": 4, "label": 4 } @@ -697,12 +674,12 @@ "name": "link-data", "values": [ { - "group": "Y", + "group": "W", "source": 0, "target": 1 }, { - "group": "W", + "group": "U", "source": 0, "target": 2 }, @@ -713,16 +690,16 @@ }, { "group": "T", - "source": 0, + "source": 1, "target": 4 }, { - "group": "Z", - "source": 1, + "group": "U", + "source": 2, "target": 4 }, { - "group": "X", + "group": "U", "source": 3, "target": 4 } @@ -752,7 +729,7 @@ "scale": "color" }, "stroke": { - "value": "black" + "value": "white" } }, "update": { @@ -760,10 +737,10 @@ "value": "pointer" }, "fx": { - "signal": "datum.fixedx != -100 ? datum.fixedx : (layoutdata ? scale('xscale', datum.fx) : null)" + "signal": "datum.inputX != -100 ? datum.inputX : scale('xscale', datum.fx)" }, "fy": { - "signal": "datum.fixedy != -100 ? datum.fixedy : (layoutdata ? scale('yscale', datum.fy) : null)" + "signal": "datum.inputY != -100 ? datum.inputY : scale('yscale', datum.fy)" }, "size": { "signal": "2 * nodeRadius * nodeRadius" @@ -1041,13 +1018,6 @@ "name": "linkDistance", "value": 80 }, - { - "bind": { - "input": "checkbox" - }, - "name": "layoutdata", - "value": false - }, { "description": "State variable for active node fix status.", "name": "fix", @@ -1100,12 +1070,6 @@ }, "update": "fix && fix.length" }, - { - "events": { - "signal": "layoutdata" - }, - "update": "true" - }, { "events": { "signal": "reset" @@ -1139,7 +1103,7 @@ "nx.set_edge_attributes(g, edge_attributions)\n", "nx.set_node_attributes(g, {k:f\"n{i}\" for i, k in enumerate(g.nodes)}, \"label\")\n", "\n", - "schema = plots.spring_force_graph(g, node_labels=\"label\", input_layout = False)\n", + "schema = plots.spring_force_graph(g, node_labels=\"label\")\n", "plots.save_schema(schema, \"_schema.json\")\n", "plots.ipy_display(schema, format=\"interactive\")" ] diff --git a/src/pyciemss/visuals/graphs.py b/src/pyciemss/visuals/graphs.py index c3eaedae5..4551057f1 100644 --- a/src/pyciemss/visuals/graphs.py +++ b/src/pyciemss/visuals/graphs.py @@ -126,11 +126,6 @@ def _layout_get(id): gjson = nx.json_graph.node_link_data(graph) schema = vega.load_schema("spring_graph.vg.json") - # TODO: - # -- Set 'inputX' and 'inputY' to original layout - # -- Copy 'fx' and 'fy' if present in 'inputX' and 'inputY' OR set based on user action - # -- Compute force-directed layout for remaning nodes - if layout: gjson["nodes"] = [ {**item, **_layout_get(item[node_labels])} for item in gjson["nodes"] diff --git a/src/pyciemss/visuals/schemas/spring_graph.vg.json b/src/pyciemss/visuals/schemas/spring_graph.vg.json index 516870fbe..be2b24eb4 100644 --- a/src/pyciemss/visuals/schemas/spring_graph.vg.json +++ b/src/pyciemss/visuals/schemas/spring_graph.vg.json @@ -133,8 +133,8 @@ "update": { "size": {"signal": "2 * nodeRadius * nodeRadius"}, "cursor": {"value": "pointer"}, - "fx": {"signal": "datum.fx == null ? scale('xscale', datum.inputX) : datum.fx"}, - "fy": {"signal": "datum.fy == null ? scale('yscale', datum.inputY) : datum.fy"} + "fx": {"signal": "datum.interactionX == null ? scale('xscale', datum.inputX) : datum.interactionX"}, + "fy": {"signal": "datum.interactionY == null ? scale('yscale', datum.inputY) : datum.interactionY"} } } }, @@ -238,17 +238,17 @@ { "name": "node-data", "values": [ - {"id": 4, "label": "Zero", "group": "A", "inputX": 2, "inputY": 5, "fx": null, "fy": null}, - {"id": 1, "label": "One", "group": "A", "inputX": 2, "inputY": 10, "fx": null, "fy": null}, - {"id": 2, "label": "Two", "group": "B", "inputX": 2, "inputY": 5, "fx": null, "fy": null}, - {"id": 3, "label": "Three", "group": "B", "inputX": 2, "inputY": 3, "fx": null, "fy": null}, - {"id": 0, "label": "Four", "group": "C", "inputX": 1, "inputY": 5, "fx": null, "fy": null}, - {"id": 5, "label": "Five", "group": "C", "inputX": 2, "inputY": 5, "fx": null, "fy": null}, - {"id": 6, "label": "Six", "group": "C", "inputX": 2, "inputY": 5, "fx": null, "fy": null} + {"id": 4, "label": "Zero", "group": "A", "inputX": 2, "inputY": 5, "interactionX": null, "interactionY": null}, + {"id": 1, "label": "One", "group": "A", "inputX": 2, "inputY": 10, "interactionX": null, "interactionY": null}, + {"id": 2, "label": "Two", "group": "B", "inputX": 2, "inputY": 5, "interactionX": null, "interactionY": null}, + {"id": 3, "label": "Three", "group": "B", "inputX": 2, "inputY": 3, "interactionX": null, "interactionY": null}, + {"id": 0, "label": "Four", "group": "C", "inputX": 1, "inputY": 5, "interactionX": null, "interactionY": null}, + {"id": 5, "label": "Five", "group": "C", "inputX": 2, "inputY": 5, "interactionX": null, "interactionY": null}, + {"id": 6, "label": "Six", "group": "C", "inputX": 2, "inputY": 5, "interactionX": null, "interactionY": null} ], "on": [ - {"trigger": "fix.length == 2", "modify": "node.datum", "values": "{fx: fix[0], fy: fix[1]}"}, - {"trigger": "reset", "modify": "reset", "values": "{fx: null, fy: null}"} + {"trigger": "fix.length == 2", "modify": "node.datum", "values": "{interactionX: fix[0], interactionY: fix[1]}"}, + {"trigger": "reset", "modify": "reset", "values": "{interactionX: null, interactionY: null}"} ] }, { From 8a33a782fd2a68bc0bca32c2e0efdc9d333fecde Mon Sep 17 00:00:00 2001 From: Joseph Cottam Date: Wed, 1 Nov 2023 15:17:23 -0700 Subject: [PATCH 14/16] Example notebook --- notebook/visual examples/Graphs.ipynb | 165 ++++++++++---------------- 1 file changed, 62 insertions(+), 103 deletions(-) diff --git a/notebook/visual examples/Graphs.ipynb b/notebook/visual examples/Graphs.ipynb index 8a896adef..7edd35cd6 100644 --- a/notebook/visual examples/Graphs.ipynb +++ b/notebook/visual examples/Graphs.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "a1299176", "metadata": {}, "outputs": [], @@ -13,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "5c1729f7-1b0d-4913-8048-01624c506cc5", "metadata": {}, "outputs": [], @@ -24,15 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "07d29614", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "997ef041-0312-4b83-bbe2-32a6ddfe3d6c", "metadata": {}, "outputs": [], @@ -42,18 +34,18 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "a4b1668c", "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -85,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 5, "id": "ece8d8e5", "metadata": {}, "outputs": [ @@ -107,58 +99,58 @@ { "modify": "node.datum", "trigger": "fix.length == 2", - "values": "{inputX: fix[0], inputY: fix[1]}" + "values": "{interactionX: fix[0], interactionY: fix[1]}" }, { "modify": "reset", "trigger": "reset", - "values": "{inputX: -100, inputY: -100}" + "values": "{interactionX: null, interactionY: null}" } ], "values": [ { - "fx": 0.15086988145661365, - "fy": 0.08835978439283941, - "group": "Y", + "fx": null, + "fy": null, + "group": "U", "id": 0, - "inputX": -100, - "inputY": -100, + "inputX": -0.1482166732511968, + "inputY": 0.06905348785594277, "label": 0 }, { - "fx": 0.04520905615931008, - "fy": -0.787027043559539, + "fx": null, + "fy": null, "group": "X", "id": 1, - "inputX": -100, - "inputY": -100, + "inputX": -1, + "inputY": 0.4564093903149109, "label": 1 }, { - "fx": 1, - "fy": 0.5856695612937016, - "group": "V", + "fx": null, + "fy": null, + "group": "W", "id": 2, - "inputX": -100, - "inputY": -100, + "inputX": 0.5833384369100308, + "inputY": 0.4592981281583665, "label": 2 }, { - "fx": -0.6643091515775201, - "fy": 0.4244389788997423, - "group": "X", + "fx": null, + "fy": null, + "group": "Z", "id": 3, - "inputX": -100, - "inputY": -100, + "inputX": 0.034337072693475655, + "inputY": -0.7451349045498585, "label": 3 }, { - "fx": -0.5317697860384047, - "fy": -0.31144128102674434, - "group": "U", + "fx": null, + "fy": null, + "group": "W", "id": 4, - "inputX": -100, - "inputY": -100, + "inputX": 0.5305411636476903, + "inputY": -0.2396261017793615, "label": 4 } ] @@ -172,27 +164,27 @@ "target": 1 }, { - "group": "U", + "group": "V", "source": 0, "target": 2 }, { - "group": "U", + "group": "V", "source": 0, "target": 3 }, { - "group": "W", + "group": "U", "source": 0, "target": 4 }, { - "group": "X", - "source": 1, + "group": "W", + "source": 2, "target": 4 }, { - "group": "V", + "group": "Y", "source": 3, "target": 4 } @@ -230,10 +222,10 @@ "value": "pointer" }, "fx": { - "signal": "datum.inputX != -100 ? datum.inputX : scale('xscale', datum.fx)" + "signal": "datum.interactionX == null ? scale('xscale', datum.inputX) : datum.interactionX" }, "fy": { - "signal": "datum.inputY != -100 ? datum.inputY : scale('yscale', datum.fy)" + "signal": "datum.interactionY == null ? scale('yscale', datum.inputY) : datum.interactionY" }, "size": { "signal": "2 * nodeRadius * nodeRadius" @@ -466,7 +458,7 @@ { "domain": { "data": "node-data", - "field": "fx" + "field": "inputX" }, "name": "xscale", "range": [ @@ -479,7 +471,7 @@ { "domain": { "data": "node-data", - "field": "fy" + "field": "inputY" }, "name": "yscale", "range": [ @@ -604,15 +596,7 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "212e5723", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 65, + "execution_count": 6, "id": "29942999", "metadata": {}, "outputs": [ @@ -634,17 +618,17 @@ { "modify": "node.datum", "trigger": "fix.length == 2", - "values": "{inputX: fix[0], inputY: fix[1]}" + "values": "{interactionX: fix[0], interactionY: fix[1]}" }, { "modify": "reset", "trigger": "reset", - "values": "{inputX: -100, inputY: -100}" + "values": "{interactionX: null, interactionY: null}" } ], "values": [ { - "group": "Y", + "group": "U", "id": 0, "label": 0 }, @@ -654,17 +638,17 @@ "label": 1 }, { - "group": "Y", + "group": "Z", "id": 2, "label": 2 }, { - "group": "Z", + "group": "U", "id": 3, "label": 3 }, { - "group": "X", + "group": "W", "id": 4, "label": 4 } @@ -674,12 +658,12 @@ "name": "link-data", "values": [ { - "group": "W", + "group": "Y", "source": 0, "target": 1 }, { - "group": "U", + "group": "T", "source": 0, "target": 2 }, @@ -689,18 +673,18 @@ "target": 3 }, { - "group": "T", - "source": 1, + "group": "W", + "source": 0, "target": 4 }, { - "group": "U", - "source": 2, + "group": "X", + "source": 1, "target": 4 }, { - "group": "U", - "source": 3, + "group": "T", + "source": 2, "target": 4 } ] @@ -737,10 +721,10 @@ "value": "pointer" }, "fx": { - "signal": "datum.inputX != -100 ? datum.inputX : scale('xscale', datum.fx)" + "signal": "datum.interactionX == null ? scale('xscale', datum.inputX) : datum.interactionX" }, "fy": { - "signal": "datum.inputY != -100 ? datum.inputY : scale('yscale', datum.fy)" + "signal": "datum.interactionY == null ? scale('yscale', datum.inputY) : datum.interactionY" }, "size": { "signal": "2 * nodeRadius * nodeRadius" @@ -973,7 +957,7 @@ { "domain": { "data": "node-data", - "field": "fx" + "field": "inputX" }, "name": "xscale", "range": [ @@ -986,7 +970,7 @@ { "domain": { "data": "node-data", - "field": "fy" + "field": "inputY" }, "name": "yscale", "range": [ @@ -1108,31 +1092,6 @@ "plots.ipy_display(schema, format=\"interactive\")" ] }, - { - "cell_type": "code", - "execution_count": 8, - "id": "7f1456f7", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{0: {'group': 'X'},\n", - " 1: {'group': 'Z'},\n", - " 2: {'group': 'T'},\n", - " 3: {'group': 'T'},\n", - " 4: {'group': 'W'}}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "node_properties" - ] - }, { "cell_type": "code", "execution_count": null, From f21b4eb1765b6ff164f46f82c2af8054f56192c2 Mon Sep 17 00:00:00 2001 From: Joseph Cottam Date: Wed, 1 Nov 2023 16:20:09 -0700 Subject: [PATCH 15/16] Added tests for graph layouts. --- test/test_visuals/test_plots.py | 75 +++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/test/test_visuals/test_plots.py b/test/test_visuals/test_plots.py index 1258cfba2..e9e7e92d2 100644 --- a/test/test_visuals/test_plots.py +++ b/test/test_visuals/test_plots.py @@ -2,10 +2,13 @@ import pandas as pd import xarray as xr import numpy as np +import networkx as nx import json import torch +import random from pathlib import Path +from itertools import chain from pyciemss.visuals import plots, vega from pyciemss.utils import get_tspan @@ -389,3 +392,75 @@ def create_fake_data(): self.assertTrue( all(mesh["__count"].isin(mesh_data[2].ravel())), "Unexpected count found" ) + + +class TestGraph(unittest.TestCase): + def setUp(self): + def rand_attributions(): + possible = "ABCD" + return random.sample(possible, random.randint(1, len(possible))) + + def rand_label(): + possible = "TUVWXYZ" + return random.randint(1, 10) + return random.sample(possible, 1)[0] + + self.g = nx.generators.barabasi_albert_graph(5, 3) + node_properties = { + n: {"attribution": rand_attributions(), "label": rand_label()} + for n in self.g.nodes() + } + + edge_attributions = { + e: {"attribution": rand_attributions()} for e in self.g.edges() + } + + nx.set_node_attributes(self.g, node_properties) + nx.set_edge_attributes(self.g, edge_attributions) + + def test_multigraph(self): + uncollapsed = plots.attributed_graph(self.g) + nodes = vega.find_named(uncollapsed["data"], "node-data")["values"] + edges = vega.find_named(uncollapsed["data"], "link-data")["values"] + self.assertEqual(len(self.g.nodes), len(nodes), "Nodes issue in conversion") + self.assertEqual(len(self.g.edges), len(edges), "Edges issue in conversion") + + all_attributions = set( + chain(*nx.get_node_attributes(self.g, "attribution").values()) + ) + nx.set_node_attributes(self.g, {0: {"attribution": all_attributions}}) + collapsed = plots.attributed_graph(self.g, collapse_all=True) + nodes = vega.find_named(collapsed["data"], "node-data")["values"] + edges = vega.find_named(collapsed["data"], "link-data")["values"] + self.assertEqual( + len(self.g.nodes), len(nodes), "Nodes issue in conversion (collapse-case)" + ) + self.assertEqual( + len(self.g.edges), len(edges), "Edges issue in conversion (collapse-case)" + ) + self.assertEqual( + [["*all*"]], + [n["attribution"] for n in nodes if n["label"] == 0], + "All tag not found as expected", + ) + + def test_springgraph(self): + schema = plots.spring_force_graph(self.g, node_labels="label") + nodes = vega.find_named(schema["data"], "node-data")["values"] + edges = vega.find_named(schema["data"], "link-data")["values"] + self.assertEqual(len(self.g.nodes), len(nodes), "Nodes issue in conversion") + self.assertEqual(len(self.g.edges), len(edges), "Edges issue in conversion") + + def test_provided_layout(self): + pos = nx.fruchterman_reingold_layout(self.g) + schema = plots.spring_force_graph(self.g, node_labels="label", layout=pos) + + nodes = vega.find_named(schema["data"], "node-data")["values"] + edges = vega.find_named(schema["data"], "link-data")["values"] + self.assertEqual(len(self.g.nodes), len(nodes), "Nodes issue in conversion") + self.assertEqual(len(self.g.edges), len(edges), "Edges issue in conversion") + + for id, (x, y) in pos.items(): + n = [n for n in nodes if n["label"] == id][0] + self.assertEqual(n["inputX"], x, f"Layout lost for {id}") + self.assertEqual(n["inputY"], y, f"Layout lost for {id}") From 850ccf5411749ca5101c9ad11dc03f3e289b7044 Mon Sep 17 00:00:00 2001 From: Joseph Cottam Date: Wed, 1 Nov 2023 16:20:18 -0700 Subject: [PATCH 16/16] Future work around graph labeling. --- src/pyciemss/visuals/graphs.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pyciemss/visuals/graphs.py b/src/pyciemss/visuals/graphs.py index 4551057f1..360a7a5e5 100644 --- a/src/pyciemss/visuals/graphs.py +++ b/src/pyciemss/visuals/graphs.py @@ -4,6 +4,9 @@ from . import vega +# TODO: The attributed-graph has more complex node_label logic than the spring-force. +# Which one is 'better'? Use it in both places. + def attributed_graph( graph: nx.Graph, *, collapse_all: bool = False, node_labels: Union[str, None] = None