Skip to content

Commit 4cdeef4

Browse files
authored
Merge pull request #85 from Carifio24/dendro-chart-studio
Add dendrogram viewer to Chart Studio exporter
2 parents 8e19610 + 4ef8b23 commit 4cdeef4

File tree

3 files changed

+57
-6
lines changed

3 files changed

+57
-6
lines changed

glue_plotly/web/export_plotly.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from glue.core.layout import Rectangle, snap_to_grid
99

10-
from glue_plotly.common import histogram, profile, scatter2d, \
10+
from glue_plotly.common import dendrogram, histogram, profile, scatter2d, \
1111
data_count, layers_to_export, base_rectilinear_axis
1212

1313
SYM = {'o': 'circle', 's': 'square', '+': 'cross', '^': 'triangle-up',
@@ -141,6 +141,20 @@ def export_profile(viewer):
141141
return traces, xaxis, yaxis
142142

143143

144+
def export_dendrogram(viewer):
145+
traces = []
146+
layers = layers_to_export(viewer)
147+
add_data_label = data_count(layers) > 1
148+
for layer in layers:
149+
data = layer.mpl_artists[0].get_xydata()
150+
trace = dendrogram.trace_for_layer(layer.state, data, add_data_label=add_data_label)
151+
traces.append(trace)
152+
153+
config = dendrogram.layout_config_from_mpl(viewer)
154+
155+
return traces, config["xaxis"], config["yaxis"]
156+
157+
144158
def build_plotly_call(app):
145159
args = []
146160
layout = {'showlegend': True, 'barmode': 'overlay', 'bargap': 0,

glue_plotly/web/qt/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
from glue_plotly.web.export_plotly import export_dendrogram
2+
3+
14
def setup():
25

36
from glue.config import exporters
@@ -6,6 +9,11 @@ def setup():
69
export_profile)
710
from glue_plotly.web.qt.exporter import save_plotly
811

12+
try:
13+
from glue_qt.plugins.dendro_viewer import DendrogramViewer
14+
DISPATCH[DendrogramViewer] = export_dendrogram
15+
except ImportError:
16+
pass
917
from glue_qt.viewers.scatter import ScatterViewer
1018
from glue_qt.viewers.histogram import HistogramViewer
1119
from glue_qt.viewers.profile import ProfileViewer

glue_plotly/web/qt/tests/test_exporter.py

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,25 @@
11
from __future__ import absolute_import, division, print_function
22

33
import json
4+
from importlib.metadata import version
5+
from packaging.version import Version
46

57
import mock
68
import pytest
79
from mock import patch
10+
from numpy import __version__ as numpy_version
811
from chart_studio.plotly import plotly
912
from plotly.exceptions import PlotlyError
1013

1114
from glue.core import Data, DataCollection
1215
from glue_qt.app import GlueApplication
1316
from glue_qt.viewers.histogram import HistogramViewer
17+
from glue_qt.viewers.profile import ProfileViewer
18+
from glue_qt.viewers.scatter import ScatterViewer
19+
try:
20+
from glue_qt.plugins.dendro_viewer import DendrogramViewer
21+
except ImportError:
22+
DendrogramViewer = None
1423

1524
from glue_plotly.web.export_plotly import build_plotly_call
1625

@@ -21,6 +30,11 @@
2130
plotly_plot = mock.MagicMock()
2231

2332

33+
# glue-qt doesn't have a __version__ so we need to do this
34+
GLUE_QT_GE_031 = Version(version("glue_qt")) > Version('0.3.1')
35+
NUMPY_LT_2 = Version(numpy_version) < Version('2')
36+
37+
2438
SIGN_IN_ERROR = """
2539
Aw, snap! You tried to use our API as the user 'BATMAN', but
2640
the supplied API key doesn't match our records. You can view
@@ -59,11 +73,26 @@ def setup_class(self):
5973
self.app = GlueApplication(dc)
6074

6175
data.style.color = '#000000'
62-
v = self.app.new_data_viewer(HistogramViewer, data=data)
63-
v.component = data.id['y']
64-
v.xmin = 0
65-
v.xmax = 10
66-
v.bins = 20
76+
hv = self.app.new_data_viewer(HistogramViewer, data=data)
77+
hv.component = data.id['y']
78+
hv.xmin = 0
79+
hv.xmax = 10
80+
hv.bins = 20
81+
82+
sv = self.app.new_data_viewer(ScatterViewer, data=data)
83+
sv.state.x_att = data.id['x']
84+
sv.state.y_att = data.id['y']
85+
86+
pv = self.app.new_data_viewer(ProfileViewer, data=data)
87+
pv.state.x_att = data.id['Pixel Axis 0 [x]']
88+
89+
# Workaround until for the issue solved in https://github.com/glue-viz/glue-qt/pull/19
90+
if (NUMPY_LT_2 or GLUE_QT_GE_031) and DendrogramViewer is not None:
91+
dendro_data = Data(label='dendrogram', parent=[-1, 0, 1, 1], height=[1.3, 2.2, 3.2, 4.4])
92+
dc.append(dendro_data)
93+
dv = self.app.new_data_viewer(DendrogramViewer, data=dendro_data)
94+
dv.state.height_att = dendro_data.id['height']
95+
dv.state.parent_att = dendro_data.id['parent']
6796

6897
self.args, self.kwargs = build_plotly_call(self.app)
6998

0 commit comments

Comments
 (0)