@@ -106,21 +106,23 @@ def find_tag(file, tag):
106
106
107
107
streaming_graph_explanation_text = find_tag (algorithm_file , explanation_tag )
108
108
109
- expand_viz_cell = '''\
110
- %%html
111
- <style>
112
- .output_wrapper, .output {
113
- height:auto !important;
114
- max-height:600px;
115
- }
116
- .output_scroll {
117
- box-shadow:none !important;
118
- webkit-box-shadow:none !important;
119
- }
120
- </style>
121
- '''
109
+ viz_intro_text = '''## Graph Visualisation
110
+
111
+ Sometimes a picture can tell more than a table of results and this is often the case with graph algorithms.
112
+ Let's see how to create a graph visualization using neovis.js.
113
+
114
+ First we'll create a div into which we will generate the visualisation.'''
115
+
116
+ python_to_js_text = '''Next we need to define the query that the visualization will be generated from, along with config
117
+ that describes which properties will be used for node size, node colour, and relationship width.
118
+
119
+ We'll then define a JavaScript variable that contains all our parameters.'''
122
120
123
- cypher_read_query = "MATCH (p1:Page)-[r:LINKS]->(p2:Page) RETURN *"
121
+ neo_vis_js_text = '''Now we're ready to call neovis.js and generate our graph visualisation.
122
+ The following code will create an interactive graph into the div defined above.
123
+ It will also extract an image representation of the graph and display that in the cell below.'''
124
+
125
+ query = "MATCH (p1:Page)-[r:LINKS]->(p2:Page) RETURN *"
124
126
125
127
labels_json = {
126
128
"Page" : {
@@ -136,15 +138,76 @@ def find_tag(file, tag):
136
138
}
137
139
}
138
140
139
- viz = '''\
140
- from scripts.vis import generate_vis
141
+ setup_js_graph_cell = '''\
142
+ from IPython.core.display import display, HTML, Javascript
143
+ from string import Template
144
+ import json
145
+
146
+ query = "MATCH (p1:Page)-[r:LINKS]->(p2:Page) RETURN *"
147
+ labels_json = {'Page': {'caption': 'name', 'size': 'pagerank'}}
148
+ relationships_json = {'LINKS': {'thickness': 'weight', 'caption': False}}
149
+
150
+ json_graph = {
151
+ "query": query,
152
+ "labels": labels_json,
153
+ "relationships": relationships_json,
154
+ "host": host,
155
+ "user": user,
156
+ "password": password
157
+ }
141
158
142
- query = "%s"
143
- labels_json = %s
144
- relationships_json = %s
159
+ Javascript("""window.jsonGraph={};""".format(json.dumps(json_graph)))'''
145
160
146
- generate_vis(host, user, password, query, labels_json, relationships_json)
147
- ''' % (cypher_read_query , labels_json , relationships_json )
161
+ neo_vis_div_cell = '''\
162
+ %%html
163
+ <style type="text/css">
164
+ .output_wrapper, .output {
165
+ height:auto !important;
166
+ max-height:600px;
167
+ }
168
+ .output_scroll {
169
+ box-shadow:none !important;
170
+ webkit-box-shadow:none !important;
171
+ }
172
+
173
+ #viz {
174
+ width: 300px;
175
+ height: 350px;
176
+ font: 22pt arial;
177
+ }
178
+ </style>
179
+ <div id="viz"></div>'''
180
+
181
+ neo_vis_js_cell = '''\
182
+ %%javascript
183
+ requirejs(['neovis.js'], function(NeoVis){
184
+ var config = {
185
+ container_id: "viz",
186
+ server_url: window.jsonGraph.host,
187
+ server_user: window.jsonGraph.user,
188
+ server_password: window.jsonGraph.password,
189
+ labels: window.jsonGraph.labels,
190
+ relationships: window.jsonGraph.relationships,
191
+ initial_cypher: window.jsonGraph.query
192
+ };
193
+
194
+ let viz = new NeoVis.default(config);
195
+ viz.render();
196
+
197
+ viz.onVisualizationRendered(function(ctx) {
198
+ let imageSrc = ctx.canvas.toDataURL();
199
+ let kernel = IPython.notebook.kernel;
200
+ let command = "image_src = '" + imageSrc + "'";
201
+ kernel.execute(command);
202
+
203
+ var nb = Jupyter.notebook;
204
+ var cell = nb.select_next().get_selected_cell();
205
+ cell.set_text("HTML('<img id=\\ "viz-image\\ " width=\\ "300px\\ " src=\\ "%s\\ " />' % image_src)")
206
+ cell.execute();
207
+ });
208
+ });'''
209
+
210
+ display_neo_vis_cell = ''''''
148
211
149
212
nb = nbf .v4 .new_notebook ()
150
213
nb ['cells' ] = [nbf .v4 .new_markdown_cell (heading_text ),
@@ -156,8 +219,13 @@ def find_tag(file, tag):
156
219
nbf .v4 .new_markdown_cell (streaming_graph_text ),
157
220
nbf .v4 .new_code_cell (run_algorithm ),
158
221
nbf .v4 .new_markdown_cell (streaming_graph_explanation_text ),
159
- nbf .v4 .new_code_cell (expand_viz_cell ),
160
- nbf .v4 .new_code_cell (viz )
222
+ nbf .v4 .new_markdown_cell (viz_intro_text ),
223
+ nbf .v4 .new_code_cell (neo_vis_div_cell ),
224
+ nbf .v4 .new_markdown_cell (python_to_js_text ),
225
+ nbf .v4 .new_code_cell (setup_js_graph_cell ),
226
+ nbf .v4 .new_markdown_cell (neo_vis_js_text ),
227
+ nbf .v4 .new_code_cell (neo_vis_js_cell ),
228
+ nbf .v4 .new_code_cell (display_neo_vis_cell )
161
229
]
162
230
163
231
output_file = 'notebooks/{0}.ipynb' .format (algorithm_name .replace (" " , "" ))
0 commit comments