Skip to content

Commit 046c2f1

Browse files
Allows usage of a vis_spec df (#98)
* Allows usage of a vis_spec df * Added reactivity to vis_spec
1 parent 7741a20 commit 046c2f1

File tree

3 files changed

+27
-8
lines changed

3 files changed

+27
-8
lines changed

src/petab_gui/controllers/mother_controller.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,7 @@ def init_plotter(self):
877877
self.measurement_controller.proxy_model,
878878
self.simulation_controller.proxy_model,
879879
self.condition_controller.proxy_model,
880+
self.visualization_controller.proxy_model
880881
)
881882
self.plotter = self.view.plot_dock
882883
self.plotter.highlighter.click_callback = self._on_plot_point_clicked

src/petab_gui/views/simple_plot_view.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,11 @@ def run(self):
4343
sim_df = self.sim_df.copy()
4444
if sim_df.empty:
4545
sim_df = None
46-
47-
try:
48-
if self.vis_df is not None:
46+
if self.group_by == "vis_df" and self.vis_df.empty:
47+
print("Empty Vis DF. Falling back to grouping by observable.")
48+
self.group_by = "observable"
49+
if self.group_by == "vis_df":
50+
try:
4951
petab_vis.plot_with_vis_spec(
5052
self.vis_df,
5153
self.cond_df,
@@ -55,8 +57,11 @@ def run(self):
5557
fig = plt.gcf()
5658
self.signals.finished.emit(fig)
5759
return
58-
except Exception as e:
59-
print(f"Invalid Visualisation DF: {e}")
60+
except Exception as e:
61+
print(f"Invalid Visualisation DF: {e}")
62+
plt.gcf()
63+
self.signals.finished.emit(fig)
64+
return
6065

6166
# Fallback
6267
plt.close("all")
@@ -100,11 +105,11 @@ def __init__(self, parent=None):
100105
self.update_timer.timeout.connect(self.plot_it)
101106
self.observable_to_subplot = {}
102107

103-
def initialize(self, meas_proxy, sim_proxy, cond_proxy):
108+
def initialize(self, meas_proxy, sim_proxy, cond_proxy, vis_proxy):
104109
self.meas_proxy = meas_proxy
105110
self.cond_proxy = cond_proxy
106111
self.sim_proxy = sim_proxy
107-
self.vis_df = None
112+
self.vis_proxy = vis_proxy
108113

109114
# Connect data changes
110115
self.options_manager.option_changed.connect(self._debounced_plot)
@@ -117,6 +122,9 @@ def initialize(self, meas_proxy, sim_proxy, cond_proxy):
117122
self.sim_proxy.dataChanged.connect(self._debounced_plot)
118123
self.sim_proxy.rowsInserted.connect(self._debounced_plot)
119124
self.sim_proxy.rowsRemoved.connect(self._debounced_plot)
125+
self.vis_proxy.dataChanged.connect(self._debounced_plot)
126+
self.vis_proxy.rowsInserted.connect(self._debounced_plot)
127+
self.vis_proxy.rowsRemoved.connect(self._debounced_plot)
120128

121129
self.plot_it()
122130

@@ -127,13 +135,14 @@ def plot_it(self):
127135
measurements_df = proxy_to_dataframe(self.meas_proxy)
128136
simulations_df = proxy_to_dataframe(self.sim_proxy)
129137
conditions_df = proxy_to_dataframe(self.cond_proxy)
138+
visualisation_df = proxy_to_dataframe(self.vis_proxy)
130139
group_by = self.options_manager.get_option()
131140
# group_by different value in petab.visualize
132141
if group_by == "condition":
133142
group_by = "simulation"
134143

135144
worker = PlotWorker(
136-
self.vis_df,
145+
visualisation_df,
137146
conditions_df,
138147
measurements_df,
139148
simulations_df,
@@ -375,6 +384,9 @@ def __init__(self, canvas, parent):
375384
grp: QAction(f"Groupy by {grp}", self)
376385
for grp in ["observable", "dataset", "condition"]
377386
}
387+
self.groupy_by_options["vis_df"] = QAction(
388+
"Use Visualization DF", self
389+
)
378390
for grp, action in self.groupy_by_options.items():
379391
action.setCheckable(True)
380392
action.triggered.connect(lambda _, grp=grp: self.manager.set_option(grp))

src/petab_gui/views/utils.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,11 @@ def proxy_to_dataframe(proxy_model):
3636
data = pd.DataFrame(data)
3737
data["simulation"] = data["simulation"].astype(float)
3838
data["time"] = data["time"].astype(float)
39+
elif proxy_model.source_model.table_type == "visualization":
40+
data = pd.DataFrame(data)
41+
data["xOffset"] = data["xOffset"].astype(float)
42+
data["yOffset"] = data["yOffset"].astype(float)
43+
else:
44+
data = pd.DataFrame(data)
3945

4046
return data

0 commit comments

Comments
 (0)