darabos commited on
Commit
11146c1
·
unverified ·
2 Parent(s): 5dc89e7 8bad190

Merge pull request #153 from biggraph/darabos-image-table

Browse files
examples/Image table.lynxkite.json ADDED
@@ -0,0 +1,364 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "edges": [
3
+ {
4
+ "id": "Example image table 1 View tables 1",
5
+ "source": "Example image table 1",
6
+ "sourceHandle": "output",
7
+ "target": "View tables 1",
8
+ "targetHandle": "bundle"
9
+ },
10
+ {
11
+ "id": "Import CSV 1 Draw molecules 1",
12
+ "source": "Import CSV 1",
13
+ "sourceHandle": "output",
14
+ "target": "Draw molecules 1",
15
+ "targetHandle": "df"
16
+ },
17
+ {
18
+ "id": "Draw molecules 1 View tables 2",
19
+ "source": "Draw molecules 1",
20
+ "sourceHandle": "output",
21
+ "target": "View tables 2",
22
+ "targetHandle": "bundle"
23
+ }
24
+ ],
25
+ "env": "LynxKite Graph Analytics",
26
+ "nodes": [
27
+ {
28
+ "data": {
29
+ "__execution_delay": null,
30
+ "collapsed": true,
31
+ "display": null,
32
+ "error": null,
33
+ "input_metadata": [],
34
+ "meta": {
35
+ "color": "orange",
36
+ "inputs": [],
37
+ "name": "Example image table",
38
+ "outputs": [
39
+ {
40
+ "name": "output",
41
+ "position": "right",
42
+ "type": {
43
+ "type": "None"
44
+ }
45
+ }
46
+ ],
47
+ "params": [],
48
+ "type": "basic"
49
+ },
50
+ "params": {},
51
+ "status": "done",
52
+ "title": "Example image table"
53
+ },
54
+ "dragHandle": ".bg-primary",
55
+ "height": 200.0,
56
+ "id": "Example image table 1",
57
+ "position": {
58
+ "x": 213.60043945845376,
59
+ "y": 306.98088700969373
60
+ },
61
+ "type": "basic",
62
+ "width": 280.0
63
+ },
64
+ {
65
+ "data": {
66
+ "display": {
67
+ "dataframes": {
68
+ "df": {
69
+ "columns": [
70
+ "names",
71
+ "images"
72
+ ],
73
+ "data": [
74
+ [
75
+ "svg",
76
+ "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\" enable-background=\"new 0 0 64 64\"><path d=\"M56 2 18.8 42.909 8 34.729 2 34.729 18.8 62 62 2z\"/></svg>"
77
+ ],
78
+ [
79
+ "data",
80
+ "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNjQgNjQiPjxwYXRoIGQ9Ik01NiAyIDE4LjggNDIuOTA5IDggMzQuNzI5IDIgMzQuNzI5IDE4LjggNjIgNjIgMnoiLz48L3N2Zz4="
81
+ ],
82
+ [
83
+ "http",
84
+ "https://upload.wikimedia.org/wikipedia/commons/2/2e/Emojione_BW_2714.svg"
85
+ ]
86
+ ]
87
+ }
88
+ },
89
+ "other": {},
90
+ "relations": []
91
+ },
92
+ "error": null,
93
+ "input_metadata": [
94
+ {
95
+ "dataframes": {
96
+ "df": {
97
+ "columns": [
98
+ "images",
99
+ "names"
100
+ ]
101
+ }
102
+ },
103
+ "other": {},
104
+ "relations": []
105
+ }
106
+ ],
107
+ "meta": {
108
+ "color": "orange",
109
+ "inputs": [
110
+ {
111
+ "name": "bundle",
112
+ "position": "left",
113
+ "type": {
114
+ "type": "<class 'lynxkite_graph_analytics.core.Bundle'>"
115
+ }
116
+ }
117
+ ],
118
+ "name": "View tables",
119
+ "outputs": [],
120
+ "params": [
121
+ {
122
+ "default": 100,
123
+ "name": "limit",
124
+ "type": {
125
+ "type": "<class 'int'>"
126
+ }
127
+ }
128
+ ],
129
+ "type": "table_view"
130
+ },
131
+ "params": {
132
+ "limit": 100.0
133
+ },
134
+ "status": "done",
135
+ "title": "View tables"
136
+ },
137
+ "dragHandle": ".bg-primary",
138
+ "height": 440.0,
139
+ "id": "View tables 1",
140
+ "position": {
141
+ "x": 626.2831607914023,
142
+ "y": 109.55448939208392
143
+ },
144
+ "type": "table_view",
145
+ "width": 376.0
146
+ },
147
+ {
148
+ "data": {
149
+ "__execution_delay": 0.0,
150
+ "collapsed": null,
151
+ "display": null,
152
+ "error": null,
153
+ "input_metadata": [],
154
+ "meta": {
155
+ "color": "orange",
156
+ "inputs": [],
157
+ "name": "Import CSV",
158
+ "outputs": [
159
+ {
160
+ "name": "output",
161
+ "position": "right",
162
+ "type": {
163
+ "type": "None"
164
+ }
165
+ }
166
+ ],
167
+ "params": [
168
+ {
169
+ "default": null,
170
+ "name": "filename",
171
+ "type": {
172
+ "type": "<class 'str'>"
173
+ }
174
+ },
175
+ {
176
+ "default": "<from file>",
177
+ "name": "columns",
178
+ "type": {
179
+ "type": "<class 'str'>"
180
+ }
181
+ },
182
+ {
183
+ "default": "<auto>",
184
+ "name": "separator",
185
+ "type": {
186
+ "type": "<class 'str'>"
187
+ }
188
+ }
189
+ ],
190
+ "type": "basic"
191
+ },
192
+ "params": {
193
+ "columns": "<from file>",
194
+ "filename": "uploads/molecules2.csv",
195
+ "separator": "<auto>"
196
+ },
197
+ "status": "done",
198
+ "title": "Import CSV"
199
+ },
200
+ "dragHandle": ".bg-primary",
201
+ "height": 313.0,
202
+ "id": "Import CSV 1",
203
+ "position": {
204
+ "x": 13.802068621055497,
205
+ "y": -269.65065144888104
206
+ },
207
+ "type": "basic",
208
+ "width": 216.0
209
+ },
210
+ {
211
+ "data": {
212
+ "display": {
213
+ "dataframes": {
214
+ "df": {
215
+ "columns": [
216
+ "name",
217
+ "smiles",
218
+ "image"
219
+ ],
220
+ "data": [
221
+ [
222
+ "ciprofloxacin",
223
+ "C1CNCCN1c(c2)c(F)cc3c2N(C4CC4)C=C(C3=O)C(=O)O",
224
+ "data:image/png;base64,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"
225
+ ],
226
+ [
227
+ "caffeine",
228
+ "CN1C=NC2=C1C(=O)N(C(=O)N2C)C",
229
+ "data:image/png;base64,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"
230
+ ],
231
+ [
232
+ "\u03b1-d-glucopyranose",
233
+ "C([C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)O)O)O)O)O",
234
+ "data:image/png;base64,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"
235
+ ]
236
+ ]
237
+ }
238
+ },
239
+ "other": {},
240
+ "relations": []
241
+ },
242
+ "error": null,
243
+ "input_metadata": [
244
+ {
245
+ "dataframes": {
246
+ "df": {
247
+ "columns": [
248
+ "image",
249
+ "name",
250
+ "smiles"
251
+ ]
252
+ }
253
+ },
254
+ "other": {},
255
+ "relations": []
256
+ }
257
+ ],
258
+ "meta": {
259
+ "color": "orange",
260
+ "inputs": [
261
+ {
262
+ "name": "bundle",
263
+ "position": "left",
264
+ "type": {
265
+ "type": "<class 'lynxkite_graph_analytics.core.Bundle'>"
266
+ }
267
+ }
268
+ ],
269
+ "name": "View tables",
270
+ "outputs": [],
271
+ "params": [
272
+ {
273
+ "default": 100,
274
+ "name": "limit",
275
+ "type": {
276
+ "type": "<class 'int'>"
277
+ }
278
+ }
279
+ ],
280
+ "type": "table_view"
281
+ },
282
+ "params": {
283
+ "limit": 100.0
284
+ },
285
+ "status": "done",
286
+ "title": "View tables"
287
+ },
288
+ "dragHandle": ".bg-primary",
289
+ "height": 418.0,
290
+ "id": "View tables 2",
291
+ "position": {
292
+ "x": 548.7706661684929,
293
+ "y": -316.9626796191875
294
+ },
295
+ "type": "table_view",
296
+ "width": 1116.0
297
+ },
298
+ {
299
+ "data": {
300
+ "__execution_delay": 0.0,
301
+ "collapsed": null,
302
+ "display": null,
303
+ "error": null,
304
+ "input_metadata": [
305
+ {}
306
+ ],
307
+ "meta": {
308
+ "color": "orange",
309
+ "inputs": [
310
+ {
311
+ "name": "df",
312
+ "position": "left",
313
+ "type": {
314
+ "type": "<class 'pandas.core.frame.DataFrame'>"
315
+ }
316
+ }
317
+ ],
318
+ "name": "Draw molecules",
319
+ "outputs": [
320
+ {
321
+ "name": "output",
322
+ "position": "right",
323
+ "type": {
324
+ "type": "None"
325
+ }
326
+ }
327
+ ],
328
+ "params": [
329
+ {
330
+ "default": null,
331
+ "name": "smiles_column",
332
+ "type": {
333
+ "type": "<class 'str'>"
334
+ }
335
+ },
336
+ {
337
+ "default": "image",
338
+ "name": "image_column",
339
+ "type": {
340
+ "type": "<class 'str'>"
341
+ }
342
+ }
343
+ ],
344
+ "type": "basic"
345
+ },
346
+ "params": {
347
+ "image_column": "image",
348
+ "smiles_column": "smiles"
349
+ },
350
+ "status": "done",
351
+ "title": "Draw molecules"
352
+ },
353
+ "dragHandle": ".bg-primary",
354
+ "height": 296.0,
355
+ "id": "Draw molecules 1",
356
+ "position": {
357
+ "x": 289.42386787591244,
358
+ "y": -258.0823121715324
359
+ },
360
+ "type": "basic",
361
+ "width": 212.0
362
+ }
363
+ ]
364
+ }
examples/draw_molecules.py ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from lynxkite.core.ops import op
2
+ import pandas as pd
3
+ import base64
4
+ import io
5
+
6
+
7
+ def pil_to_data(image):
8
+ buffer = io.BytesIO()
9
+ image.save(buffer, format="png")
10
+ b64 = base64.b64encode(buffer.getvalue()).decode("utf-8")
11
+ return "data:image/png;base64," + b64
12
+
13
+
14
+ def smiles_to_data(smiles):
15
+ import rdkit
16
+
17
+ m = rdkit.Chem.MolFromSmiles(smiles)
18
+ img = rdkit.Chem.Draw.MolToImage(m)
19
+ data = pil_to_data(img)
20
+ return data
21
+
22
+
23
+ @op("LynxKite Graph Analytics", "Draw molecules")
24
+ def draw_molecules(df: pd.DataFrame, *, smiles_column: str, image_column: str = "image"):
25
+ df = df.copy()
26
+ df[image_column] = df[smiles_column].apply(smiles_to_data)
27
+ return df
examples/make_image_table.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from lynxkite.core.ops import op
2
+ import pandas as pd
3
+ import base64
4
+
5
+
6
+ @op("LynxKite Graph Analytics", "Example image table")
7
+ def make_image_table():
8
+ svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M56 2 18.8 42.909 8 34.729 2 34.729 18.8 62 62 2z"/></svg>'
9
+ data = "data:image/svg+xml;base64," + base64.b64encode(svg.encode("utf-8")).decode("utf-8")
10
+ http = "https://upload.wikimedia.org/wikipedia/commons/2/2e/Emojione_BW_2714.svg"
11
+ return pd.DataFrame({"names": ["svg", "data", "http"], "images": [svg, data, http]})
examples/uploads/molecules2.csv ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ name,smiles
2
+ ciprofloxacin,C1CNCCN1c(c2)c(F)cc3c2N(C4CC4)C=C(C3=O)C(=O)O
3
+ caffeine,CN1C=NC2=C1C(=O)N(C(=O)N2C)C
4
+ α-d-glucopyranose,C([C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)O)O)O)O)O
lynxkite-app/web/src/index.css CHANGED
@@ -274,6 +274,16 @@ body {
274
  padding: 5px 10px;
275
  width: 100%;
276
  }
 
 
 
 
 
 
 
 
 
 
277
  }
278
 
279
  .params-expander {
 
274
  padding: 5px 10px;
275
  width: 100%;
276
  }
277
+
278
+ .table-viewer {
279
+ td {
280
+ padding: 5px 10px;
281
+ }
282
+
283
+ .image-in-table {
284
+ max-height: 100px;
285
+ }
286
+ }
287
  }
288
 
289
  .params-expander {
lynxkite-app/web/src/workspace/nodes/Table.tsx CHANGED
@@ -1,6 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  export default function Table(props: any) {
2
  return (
3
- <table id={props.name || "table"}>
4
  <thead>
5
  <tr>
6
  {props.columns.map((column: string) => (
@@ -12,7 +27,9 @@ export default function Table(props: any) {
12
  {props.data.map((row: { [column: string]: any }, i: number) => (
13
  <tr key={`row-${i}`}>
14
  {props.columns.map((_column: string, j: number) => (
15
- <td key={`cell ${i}, ${j}`}>{JSON.stringify(row[j])}</td>
 
 
16
  ))}
17
  </tr>
18
  ))}
 
1
+ function Cell({ value }: { value: any }) {
2
+ if (typeof value === "string") {
3
+ if (value.startsWith("https://") || value.startsWith("data:")) {
4
+ return <img className="image-in-table" src={value} alt={value} />;
5
+ }
6
+ if (value.startsWith("<svg")) {
7
+ // A data URL is safer than just dropping it in the DOM.
8
+ const data = `data:image/svg+xml;base64,${btoa(value)}`;
9
+ return <img className="image-in-table" src={data} alt={value} />;
10
+ }
11
+ return <>{value}</>;
12
+ }
13
+ return <>{JSON.stringify(value)}</>;
14
+ }
15
+
16
  export default function Table(props: any) {
17
  return (
18
+ <table className="table-viewer">
19
  <thead>
20
  <tr>
21
  {props.columns.map((column: string) => (
 
27
  {props.data.map((row: { [column: string]: any }, i: number) => (
28
  <tr key={`row-${i}`}>
29
  {props.columns.map((_column: string, j: number) => (
30
+ <td key={`cell ${i}, ${j}`}>
31
+ <Cell value={row[j]} />
32
+ </td>
33
  ))}
34
  </tr>
35
  ))}
lynxkite-app/web/tests/graph_creation.spec.ts CHANGED
@@ -23,18 +23,22 @@ test.afterEach(async () => {
23
 
24
  test("Tables are displayed in the Graph creation box", async () => {
25
  const graphBox = await workspace.getBox("Create graph 1");
26
- const nodesTableHeader = await graphBox.locator(".graph-tables .df-head", {
27
  hasText: "nodes",
28
  });
29
- const edgesTableHeader = await graphBox.locator(".graph-tables .df-head", {
30
  hasText: "edges",
31
  });
 
 
32
  await expect(nodesTableHeader).toBeVisible();
33
  await expect(edgesTableHeader).toBeVisible();
34
- nodesTableHeader.click();
35
- await expect(graphBox.locator("#nodes-table")).toBeVisible();
36
- edgesTableHeader.click();
37
- await expect(graphBox.locator("#edges-table")).toBeVisible();
 
 
38
  });
39
 
40
  test("Adding and removing relationships", async () => {
 
23
 
24
  test("Tables are displayed in the Graph creation box", async () => {
25
  const graphBox = await workspace.getBox("Create graph 1");
26
+ const nodesTableHeader = graphBox.locator(".graph-tables .df-head", {
27
  hasText: "nodes",
28
  });
29
+ const edgesTableHeader = graphBox.locator(".graph-tables .df-head", {
30
  hasText: "edges",
31
  });
32
+ const nodesTable = nodesTableHeader.locator("xpath=//following-sibling::table[1]");
33
+ const edgesTable = edgesTableHeader.locator("xpath=//following-sibling::table[1]");
34
  await expect(nodesTableHeader).toBeVisible();
35
  await expect(edgesTableHeader).toBeVisible();
36
+ await expect(nodesTable).not.toBeVisible();
37
+ await expect(edgesTable).not.toBeVisible();
38
+ await nodesTableHeader.click();
39
+ await expect(nodesTable).toBeVisible();
40
+ await edgesTableHeader.click();
41
+ await expect(edgesTable).toBeVisible();
42
  });
43
 
44
  test("Adding and removing relationships", async () => {