Skip to content

Commit a32765d

Browse files
Fix issues exporting various image and chart formats. (#42)
1 parent a40e0e8 commit a32765d

File tree

2 files changed

+47
-4
lines changed

2 files changed

+47
-4
lines changed

spotfire/sbdf.pyx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,7 +1177,7 @@ cdef _export_obj_matplotlib_figure(obj, default_column_name):
11771177
cdef np_c.ndarray values
11781178

11791179
context = _ExportContext()
1180-
context.set_valuetype(sbdf_c.sbdf_vt_binary())
1180+
context.set_valuetype_id(sbdf_c.SBDF_BINARYTYPEID)
11811181
with io.BytesIO() as buf:
11821182
obj.set_canvas(matplotlib.pyplot.gcf().canvas)
11831183
obj.savefig(buf, format="png")
@@ -1198,7 +1198,7 @@ cdef _export_obj_seaborn_grid(obj, default_column_name):
11981198
cdef np_c.ndarray values
11991199

12001200
context = _ExportContext()
1201-
context.set_valuetype(sbdf_c.sbdf_vt_binary())
1201+
context.set_valuetype_id(sbdf_c.SBDF_BINARYTYPEID)
12021202
with io.BytesIO() as buf:
12031203
obj.savefig(buf)
12041204
values = np.array([buf.getvalue()], dtype='object')
@@ -1218,9 +1218,9 @@ cdef _export_obj_pil_image(obj, default_column_name):
12181218
cdef np_c.ndarray values
12191219

12201220
context = _ExportContext()
1221-
context.set_valuetype(sbdf_c.sbdf_vt_binary())
1221+
context.set_valuetype_id(sbdf_c.SBDF_BINARYTYPEID)
12221222
with io.BytesIO() as buf:
1223-
obj.save(buf)
1223+
obj.save(buf, format="png")
12241224
values = np.array([buf.getvalue()], dtype='object')
12251225
context.set_arrays(values, [False])
12261226

spotfire/test/test_sbdf.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import pandas
1010
import pandas.testing
1111
import geopandas
12+
import matplotlib.pyplot
13+
import seaborn
14+
import PIL.Image
1215

1316
import spotfire
1417
from spotfire import sbdf
@@ -413,3 +416,43 @@ def test_non_str_column_name(self):
413416
df2 = sbdf.import_data(f"{tempdir}/output.sbdf")
414417
for i, col in enumerate(df2.columns):
415418
self.assertEqual(type(col), str, f"df2.columns[{i}] = {repr(col)}")
419+
420+
def test_image_matplot(self):
421+
"""Verify Matplotlib figures export properly"""
422+
matplotlib.pyplot.clf()
423+
fig, _ = matplotlib.pyplot.subplots()
424+
with tempfile.TemporaryDirectory() as tempdir:
425+
sbdf.export_data(fig, f"{tempdir}/output.sbdf")
426+
df2 = sbdf.import_data(f"{tempdir}/output.sbdf")
427+
self.assertEqual(len(df2), 1)
428+
self.assertEqual(len(df2.columns), 1)
429+
self.assertEqual(df2.columns[0], 'x')
430+
val = df2.at[0, "x"]
431+
self.assertEqual(val[0:8], b'\x89PNG\x0d\x0a\x1a\x0a')
432+
433+
def test_image_seaborn(self):
434+
"""Verify Seaborn grids export properly"""
435+
matplotlib.pyplot.clf()
436+
dataframe = pandas.DataFrame({'x': range(10), 'y': range(10, 0, -1)})
437+
grid = seaborn.FacetGrid(dataframe)
438+
with tempfile.TemporaryDirectory() as tempdir:
439+
sbdf.export_data(grid, f"{tempdir}/output.sbdf")
440+
df2 = sbdf.import_data(f"{tempdir}/output.sbdf")
441+
self.assertEqual(len(df2), 1)
442+
self.assertEqual(len(df2.columns), 1)
443+
self.assertEqual(df2.columns[0], 'x')
444+
val = df2.at[0, "x"]
445+
self.assertEqual(val[0:8], b'\x89PNG\x0d\x0a\x1a\x0a')
446+
447+
def test_image_pil(self):
448+
"""Verify PIL images export properly"""
449+
image = PIL.Image.new("RGB", (100, 100))
450+
with tempfile.TemporaryDirectory() as tempdir:
451+
sbdf.export_data(image, f"{tempdir}/output.sbdf")
452+
df2 = sbdf.import_data(f"{tempdir}/output.sbdf")
453+
val = df2.at[0, "x"]
454+
self.assertEqual(len(df2), 1)
455+
self.assertEqual(len(df2.columns), 1)
456+
self.assertEqual(df2.columns[0], 'x')
457+
val = df2.at[0, "x"]
458+
self.assertEqual(val[0:8], b'\x89PNG\x0d\x0a\x1a\x0a')

0 commit comments

Comments
 (0)