Last active
August 29, 2015 13:56
-
-
Save Midnighter/8906987 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"metadata": { | |
"name": "" | |
}, | |
"nbformat": 3, | |
"nbformat_minor": 0, | |
"worksheets": [ | |
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"# stdlib\n", | |
"import os\n", | |
"import json\n", | |
"# external\n", | |
"import networkx as nx\n", | |
"import networkx.readwrite.json_graph as nx_json\n", | |
"import vincent" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 1 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"vincent.core.initialize_notebook()" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"javascript": [ | |
"\n", | |
" if (window['d3'] === undefined) {\n", | |
" require.config({ paths: {d3: \"http://d3js.org/d3.v3.min\"} });\n", | |
" require([\"d3\"], function(d3) {\n", | |
" window.d3 = d3;\n", | |
" $.getScript(\"http://d3js.org/d3.geo.projection.v0.min.js\", function() {\n", | |
" $.getScript(\"http://wrobstory.github.io/d3-cloud/d3.layout.cloud.js\", function() {\n", | |
" $.getScript(\"http://d3js.org/topojson.v1.min.js\", function() {\n", | |
" $.getScript(\"http://trifacta.github.com/vega/vega.js\", function() {\n", | |
" $([IPython.events]).trigger(\"vega_loaded.vincent\");\n", | |
" })\n", | |
" })\n", | |
" })\n", | |
" });\n", | |
" });\n", | |
" };\n", | |
" " | |
], | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": [ | |
"<IPython.core.display.Javascript at 0x1eb1090>" | |
] | |
} | |
], | |
"prompt_number": 2 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"def vega_example(json_path):\n", | |
" \"\"\"wrap a JSON graph representation in JSON that allows vega display.\"\"\"\n", | |
" vega_json = {\n", | |
" \"name\": \"force\",\n", | |
" \"width\": 500,\n", | |
" \"height\": 500,\n", | |
" \"padding\": {\"top\":0, \"bottom\":0, \"left\":0, \"right\":0},\n", | |
" \"data\": [\n", | |
" {\n", | |
" \"name\": \"edges\",\n", | |
" \"url\": \"\",\n", | |
" \"format\": {\"type\": \"json\", \"property\": \"links\"},\n", | |
" \"transform\": [\n", | |
" {\"type\": \"copy\", \"from\": \"data\", \"fields\": [\"source\", \"target\"]}\n", | |
" ]\n", | |
" },\n", | |
" {\n", | |
" \"name\": \"nodes\",\n", | |
" \"url\": \"\",\n", | |
" \"format\": {\"type\": \"json\", \"property\": \"nodes\"},\n", | |
" \"transform\": [\n", | |
" {\n", | |
" \"type\": \"force\",\n", | |
" \"links\": \"edges\",\n", | |
" \"linkDistance\": 70,\n", | |
" \"charge\": -100,\n", | |
" \"iterations\": 1000\n", | |
" }\n", | |
" ]\n", | |
" }\n", | |
" ],\n", | |
" \"marks\": [\n", | |
" {\n", | |
" \"type\": \"path\",\n", | |
" \"from\": {\n", | |
" \"data\": \"edges\",\n", | |
" \"transform\": [\n", | |
" {\"type\": \"link\", \"shape\": \"line\"}\n", | |
" ]\n", | |
" },\n", | |
" \"properties\": {\n", | |
" \"update\": {\n", | |
" \"path\": {\"field\": \"path\"},\n", | |
" \"stroke\": {\"value\": \"#ccc\"},\n", | |
" \"strokeWidth\": {\"value\": 0.5}\n", | |
" }\n", | |
" }\n", | |
" },\n", | |
" {\n", | |
" \"type\": \"symbol\",\n", | |
" \"from\": {\"data\": \"nodes\"},\n", | |
" \"properties\": {\n", | |
" \"enter\": {\n", | |
" \"fillOpacity\": {\"value\": 0.3},\n", | |
" \"stroke\": {\"value\": \"steelblue\"}\n", | |
" },\n", | |
" \"update\": {\n", | |
" \"x\": {\"field\": \"x\"},\n", | |
" \"y\": {\"field\": \"y\"},\n", | |
" \"fill\": {\"value\": \"steelblue\"}\n", | |
" },\n", | |
" \"hover\": {\n", | |
" \"fill\": {\"value\": \"#f00\"}\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" ]\n", | |
" }\n", | |
" vega_json[\"data\"][0][\"url\"] = os.path.join(\"files\", json_path)\n", | |
" vega_json[\"data\"][1][\"url\"] = os.path.join(\"files\", json_path)\n", | |
" return vega_json" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 3 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"def display(json):\n", | |
" \"\"\"Display visualization inline in IPython notebook\"\"\"\n", | |
" from IPython.core.display import display, HTML, Javascript\n", | |
" from uuid import uuid4\n", | |
"\n", | |
" # Copied from vincent.ipynb:\n", | |
" # HACK: use a randomly chosen unique div id\n", | |
" id = str(uuid4())\n", | |
" a = HTML('<div id=\"vis%s\"></div>' % id)\n", | |
" b = Javascript(_vega_t % (json, id))\n", | |
" display(a, b)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 4 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"_vega_t = \"\"\"\n", | |
"( function() {\n", | |
" var _do_plot = function() {\n", | |
" if ( typeof vg == 'undefined' ) {\n", | |
" $([IPython.events]).on(\"vega_loaded.vincent\", _do_plot);\n", | |
" return;\n", | |
" }\n", | |
" vg.parse.spec(%s, function(chart) {\n", | |
" chart({el: \"#vis%s\"}).update();\n", | |
" });\n", | |
" };\n", | |
" _do_plot();\n", | |
"})();\n", | |
"\"\"\"" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 5 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"display(vega_example(\"miserables.json\"))" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": [ | |
"<div id=\"visc2e8e20f-ab60-455b-9409-baf46b83b88b\"></div>" | |
], | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": [ | |
"<IPython.core.display.HTML at 0x28e9810>" | |
] | |
}, | |
{ | |
"javascript": [ | |
"\n", | |
"( function() {\n", | |
" var _do_plot = function() {\n", | |
" if ( typeof vg == 'undefined' ) {\n", | |
" $([IPython.events]).on(\"vega_loaded.vincent\", _do_plot);\n", | |
" return;\n", | |
" }\n", | |
" vg.parse.spec({'name': 'force', 'height': 500, 'padding': {'top': 0, 'left': 0, 'right': 0, 'bottom': 0}, 'width': 500, 'marks': [{'from': {'data': 'edges', 'transform': [{'shape': 'line', 'type': 'link'}]}, 'type': 'path', 'properties': {'update': {'path': {'field': 'path'}, 'stroke': {'value': '#ccc'}, 'strokeWidth': {'value': 0.5}}}}, {'from': {'data': 'nodes'}, 'type': 'symbol', 'properties': {'hover': {'fill': {'value': '#f00'}}, 'update': {'y': {'field': 'y'}, 'x': {'field': 'x'}, 'fill': {'value': 'steelblue'}}, 'enter': {'stroke': {'value': 'steelblue'}, 'fillOpacity': {'value': 0.3}}}}], 'data': [{'url': 'files/miserables.json', 'transform': [{'from': 'data', 'type': 'copy', 'fields': ['source', 'target']}], 'name': 'edges', 'format': {'property': 'links', 'type': 'json'}}, {'url': 'files/miserables.json', 'transform': [{'iterations': 1000, 'charge': -100, 'type': 'force', 'linkDistance': 70, 'links': 'edges'}], 'name': 'nodes', 'format': {'property': 'nodes', 'type': 'json'}}]}, function(chart) {\n", | |
" chart({el: \"#visc2e8e20f-ab60-455b-9409-baf46b83b88b\"}).update();\n", | |
" });\n", | |
" };\n", | |
" _do_plot();\n", | |
"})();\n" | |
], | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": [ | |
"<IPython.core.display.Javascript at 0x28e9850>" | |
] | |
} | |
], | |
"prompt_number": 6 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"kar_g = nx.karate_club_graph()\n", | |
"json.dump(nx_json.node_link_data(kar_g), open(\"karate.json\", \"w\"))" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 7 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"display(vega_example(\"karate.json\"))" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": [ | |
"<div id=\"vis5c8d02fb-92ca-4c06-ba28-53016ab761a5\"></div>" | |
], | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": [ | |
"<IPython.core.display.HTML at 0x28e97d0>" | |
] | |
}, | |
{ | |
"javascript": [ | |
"\n", | |
"( function() {\n", | |
" var _do_plot = function() {\n", | |
" if ( typeof vg == 'undefined' ) {\n", | |
" $([IPython.events]).on(\"vega_loaded.vincent\", _do_plot);\n", | |
" return;\n", | |
" }\n", | |
" vg.parse.spec({'name': 'force', 'height': 500, 'padding': {'top': 0, 'left': 0, 'right': 0, 'bottom': 0}, 'width': 500, 'marks': [{'from': {'data': 'edges', 'transform': [{'shape': 'line', 'type': 'link'}]}, 'type': 'path', 'properties': {'update': {'path': {'field': 'path'}, 'stroke': {'value': '#ccc'}, 'strokeWidth': {'value': 0.5}}}}, {'from': {'data': 'nodes'}, 'type': 'symbol', 'properties': {'hover': {'fill': {'value': '#f00'}}, 'update': {'y': {'field': 'y'}, 'x': {'field': 'x'}, 'fill': {'value': 'steelblue'}}, 'enter': {'stroke': {'value': 'steelblue'}, 'fillOpacity': {'value': 0.3}}}}], 'data': [{'url': 'files/karate.json', 'transform': [{'from': 'data', 'type': 'copy', 'fields': ['source', 'target']}], 'name': 'edges', 'format': {'property': 'links', 'type': 'json'}}, {'url': 'files/karate.json', 'transform': [{'iterations': 1000, 'charge': -100, 'type': 'force', 'linkDistance': 70, 'links': 'edges'}], 'name': 'nodes', 'format': {'property': 'nodes', 'type': 'json'}}]}, function(chart) {\n", | |
" chart({el: \"#vis5c8d02fb-92ca-4c06-ba28-53016ab761a5\"}).update();\n", | |
" });\n", | |
" };\n", | |
" _do_plot();\n", | |
"})();\n" | |
], | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": [ | |
"<IPython.core.display.Javascript at 0x28e9810>" | |
] | |
} | |
], | |
"prompt_number": 8 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"simple = nx.Graph(name=\"test\")\n", | |
"simple.add_edge(1, 2)\n", | |
"simple.add_edge(1, 3)\n", | |
"simple.add_edge(3, 2)\n", | |
"json.dump(nx_json.node_link_data(simple), open(\"simple.json\", \"w\"))" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 9 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"display(vega_example(\"simple.json\"))" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": [ | |
"<div id=\"vis77e1c009-f591-465e-bcbd-0c0eebc5444b\"></div>" | |
], | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": [ | |
"<IPython.core.display.HTML at 0x28e95d0>" | |
] | |
}, | |
{ | |
"javascript": [ | |
"\n", | |
"( function() {\n", | |
" var _do_plot = function() {\n", | |
" if ( typeof vg == 'undefined' ) {\n", | |
" $([IPython.events]).on(\"vega_loaded.vincent\", _do_plot);\n", | |
" return;\n", | |
" }\n", | |
" vg.parse.spec({'name': 'force', 'height': 500, 'padding': {'top': 0, 'left': 0, 'right': 0, 'bottom': 0}, 'width': 500, 'marks': [{'from': {'data': 'edges', 'transform': [{'shape': 'line', 'type': 'link'}]}, 'type': 'path', 'properties': {'update': {'path': {'field': 'path'}, 'stroke': {'value': '#ccc'}, 'strokeWidth': {'value': 0.5}}}}, {'from': {'data': 'nodes'}, 'type': 'symbol', 'properties': {'hover': {'fill': {'value': '#f00'}}, 'update': {'y': {'field': 'y'}, 'x': {'field': 'x'}, 'fill': {'value': 'steelblue'}}, 'enter': {'stroke': {'value': 'steelblue'}, 'fillOpacity': {'value': 0.3}}}}], 'data': [{'url': 'files/simple.json', 'transform': [{'from': 'data', 'type': 'copy', 'fields': ['source', 'target']}], 'name': 'edges', 'format': {'property': 'links', 'type': 'json'}}, {'url': 'files/simple.json', 'transform': [{'iterations': 1000, 'charge': -100, 'type': 'force', 'linkDistance': 70, 'links': 'edges'}], 'name': 'nodes', 'format': {'property': 'nodes', 'type': 'json'}}]}, function(chart) {\n", | |
" chart({el: \"#vis77e1c009-f591-465e-bcbd-0c0eebc5444b\"}).update();\n", | |
" });\n", | |
" };\n", | |
" _do_plot();\n", | |
"})();\n" | |
], | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": [ | |
"<IPython.core.display.Javascript at 0x28e9710>" | |
] | |
} | |
], | |
"prompt_number": 10 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"from itertools import izip, count\n", | |
"from vincent.core import grammar, _assert_is_type\n", | |
"from vincent._compat import str_types\n", | |
"\n", | |
"@grammar(str_types)\n", | |
"def shape(value):\n", | |
" \"\"\"\n", | |
" \"\"\"\n", | |
"vincent.Transform.shape = shape\n", | |
"\n", | |
"@grammar(grammar_type=vincent.ValueRef, grammar_name='strokeWidth')\n", | |
"def stroke_width(value):\n", | |
" \"\"\"ValueRef : float, width of the stroke in pixels\n", | |
" \"\"\"\n", | |
" if value.value:\n", | |
" _assert_is_type('stroke_width.value', value.value, float)\n", | |
" if value.value < 0:\n", | |
" raise ValueError('stroke width cannot be negative')\n", | |
"vincent.PropertySet.stroke_width = stroke_width\n", | |
"\n", | |
"class Graph(vincent.Visualization):\n", | |
" def __init__(self, graph, width=500, height=500, weight=\"weight\", **kw_args):\n", | |
" super(Graph, self).__init__(**kw_args)\n", | |
" self.width = int(width)\n", | |
" self.height = int(height)\n", | |
" self.padding = dict(top=10, bottom=10, left=10, right=10)\n", | |
" self.name = graph.name # if graph.name else \"NX Graph\"\n", | |
" nx_nodes = sorted(graph.nodes())\n", | |
" node2id = dict(izip(nx_nodes, count()))\n", | |
" edges = vincent.Data(name=\"edges\")\n", | |
" edges.values = [dict(source=node2id[u], target=node2id[v]) for (u, v, d) in graph.edges_iter(data=True)]\n", | |
" edges.transform = [vincent.Transform(type=\"copy\", from_=\"data\", fields=[\"source\", \"target\"])]\n", | |
" self.data.append(edges)\n", | |
" nodes = vincent.Data(name=\"nodes\")\n", | |
" nodes.values = [dict(name=str(n)) for n in nx_nodes]\n", | |
" nodes.transform = [vincent.Transform(type=\"force\", links=\"edges\", iterations=1000, charge=-100,\n", | |
" link_distance=70, link_strength=100)]\n", | |
" self.data.append(nodes)\n", | |
" mark = vincent.Mark(type=\"path\",\n", | |
" from_=vincent.MarkRef(data=\"edges\", transform=[vincent.Transform(type=\"link\", shape=\"line\")]),\n", | |
" properties=vincent.MarkProperties(update=vincent.PropertySet(\n", | |
" path=vincent.ValueRef(field=\"path\"),\n", | |
" stroke=vincent.ValueRef(value=\"#ccc\"),\n", | |
" stroke_width=vincent.ValueRef(value=0.5)\n", | |
" )\n", | |
" )\n", | |
" )\n", | |
" self.marks.append(mark)\n", | |
" mark = vincent.Mark(type=\"symbol\",\n", | |
" from_=vincent.MarkRef(data=\"nodes\"),\n", | |
" properties=vincent.MarkProperties(enter=vincent.PropertySet(\n", | |
" fill_opacity=vincent.ValueRef(value=0.3),\n", | |
" stroke=vincent.ValueRef(value=\"steelblue\")\n", | |
" ),\n", | |
" update=vincent.PropertySet(\n", | |
" x=vincent.ValueRef(field=\"x\"),\n", | |
" y=vincent.ValueRef(field=\"y\"),\n", | |
" fill=vincent.ValueRef(value=\"steelblue\")\n", | |
" ),\n", | |
" hover=vincent.PropertySet(fill=vincent.ValueRef(value=\"#f00\"))\n", | |
" )\n", | |
" )\n", | |
" self.marks.append(mark)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 11 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"graph = Graph(simple)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 12 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"graph.display()" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": [ | |
"<div id=\"vis59997\"></div>" | |
], | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": [ | |
"<IPython.core.display.HTML at 0x28e9fd0>" | |
] | |
}, | |
{ | |
"javascript": [ | |
"\n", | |
"( function() {\n", | |
" var _do_plot = function() {\n", | |
" if ( typeof vg == 'undefined' ) {\n", | |
" $([IPython.events]).on(\"vega_loaded.vincent\", _do_plot);\n", | |
" return;\n", | |
" }\n", | |
" vg.parse.spec({\"axes\": [], \"data\": [{\"name\": \"edges\", \"transform\": [{\"fields\": [\"source\", \"target\"], \"from\": \"data\", \"type\": \"copy\"}], \"values\": [{\"source\": 0, \"target\": 1}, {\"source\": 0, \"target\": 2}, {\"source\": 1, \"target\": 2}]}, {\"name\": \"nodes\", \"transform\": [{\"charge\": -100, \"iterations\": 1000, \"linkDistance\": 70, \"linkStrength\": 100, \"links\": \"edges\", \"type\": \"force\"}], \"values\": [{\"name\": \"1\"}, {\"name\": \"2\"}, {\"name\": \"3\"}]}], \"height\": 500, \"legends\": [], \"marks\": [{\"from\": {\"data\": \"edges\", \"transform\": [{\"shape\": \"line\", \"type\": \"link\"}]}, \"properties\": {\"update\": {\"path\": {\"field\": \"path\"}, \"stroke\": {\"value\": \"#ccc\"}, \"strokeWidth\": {\"value\": 0.5}}}, \"type\": \"path\"}, {\"from\": {\"data\": \"nodes\"}, \"properties\": {\"enter\": {\"fillOpacity\": {\"value\": 0.3}, \"stroke\": {\"value\": \"steelblue\"}}, \"hover\": {\"fill\": {\"value\": \"#f00\"}}, \"update\": {\"fill\": {\"value\": \"steelblue\"}, \"x\": {\"field\": \"x\"}, \"y\": {\"field\": \"y\"}}}, \"type\": \"symbol\"}], \"name\": \"test\", \"padding\": {\"bottom\": 10, \"left\": 10, \"right\": 10, \"top\": 10}, \"scales\": [], \"width\": 500}, function(chart) {\n", | |
" chart({el: \"#vis59997\"}).update();\n", | |
" });\n", | |
" };\n", | |
" _do_plot();\n", | |
"})();\n" | |
], | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": [ | |
"<IPython.core.display.Javascript at 0x28e9590>" | |
] | |
} | |
], | |
"prompt_number": 13 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"print graph.to_json()" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"{\n", | |
" \"axes\": [],\n", | |
" \"data\": [\n", | |
" {\n", | |
" \"name\": \"edges\",\n", | |
" \"transform\": [\n", | |
" {\n", | |
" \"fields\": [\n", | |
" \"source\",\n", | |
" \"target\"\n", | |
" ],\n", | |
" \"from\": \"data\",\n", | |
" \"type\": \"copy\"\n", | |
" }\n", | |
" ],\n", | |
" \"values\": [\n", | |
" {\n", | |
" \"source\": 0,\n", | |
" \"target\": 1\n", | |
" },\n", | |
" {\n", | |
" \"source\": 0,\n", | |
" \"target\": 2\n", | |
" },\n", | |
" {\n", | |
" \"source\": 1,\n", | |
" \"target\": 2\n", | |
" }\n", | |
" ]\n", | |
" },\n", | |
" {\n", | |
" \"name\": \"nodes\",\n", | |
" \"transform\": [\n", | |
" {\n", | |
" \"charge\": -100,\n", | |
" \"iterations\": 1000,\n", | |
" \"linkDistance\": 70,\n", | |
" \"linkStrength\": 100,\n", | |
" \"links\": \"edges\",\n", | |
" \"type\": \"force\"\n", | |
" }\n", | |
" ],\n", | |
" \"values\": [\n", | |
" {\n", | |
" \"name\": \"1\"\n", | |
" },\n", | |
" {\n", | |
" \"name\": \"2\"\n", | |
" },\n", | |
" {\n", | |
" \"name\": \"3\"\n", | |
" }\n", | |
" ]\n", | |
" }\n", | |
" ],\n", | |
" \"height\": 500,\n", | |
" \"legends\": [],\n", | |
" \"marks\": [\n", | |
" {\n", | |
" \"from\": {\n", | |
" \"data\": \"edges\",\n", | |
" \"transform\": [\n", | |
" {\n", | |
" \"shape\": \"line\",\n", | |
" \"type\": \"link\"\n", | |
" }\n", | |
" ]\n", | |
" },\n", | |
" \"properties\": {\n", | |
" \"update\": {\n", | |
" \"path\": {\n", | |
" \"field\": \"path\"\n", | |
" },\n", | |
" \"stroke\": {\n", | |
" \"value\": \"#ccc\"\n", | |
" },\n", | |
" \"strokeWidth\": {\n", | |
" \"value\": 0.5\n", | |
" }\n", | |
" }\n", | |
" },\n", | |
" \"type\": \"path\"\n", | |
" },\n", | |
" {\n", | |
" \"from\": {\n", | |
" \"data\": \"nodes\"\n", | |
" },\n", | |
" \"properties\": {\n", | |
" \"enter\": {\n", | |
" \"fillOpacity\": {\n", | |
" \"value\": 0.3\n", | |
" },\n", | |
" \"stroke\": {\n", | |
" \"value\": \"steelblue\"\n", | |
" }\n", | |
" },\n", | |
" \"hover\": {\n", | |
" \"fill\": {\n", | |
" \"value\": \"#f00\"\n", | |
" }\n", | |
" },\n", | |
" \"update\": {\n", | |
" \"fill\": {\n", | |
" \"value\": \"steelblue\"\n", | |
" },\n", | |
" \"x\": {\n", | |
" \"field\": \"x\"\n", | |
" },\n", | |
" \"y\": {\n", | |
" \"field\": \"y\"\n", | |
" }\n", | |
" }\n", | |
" },\n", | |
" \"type\": \"symbol\"\n", | |
" }\n", | |
" ],\n", | |
" \"name\": \"test\",\n", | |
" \"padding\": {\n", | |
" \"bottom\": 10,\n", | |
" \"left\": 10,\n", | |
" \"right\": 10,\n", | |
" \"top\": 10\n", | |
" },\n", | |
" \"scales\": [],\n", | |
" \"width\": 500\n", | |
"}\n" | |
] | |
} | |
], | |
"prompt_number": 14 | |
} | |
], | |
"metadata": {} | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment