Skip to content

Commit c432a11

Browse files
committed
Enh: draw std of cf.data (only cortical profiles). Fix: cf.data missing brackets
1 parent e242ee6 commit c432a11

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

siibra/features/feature.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,7 @@ def _get_merged_feature(self) -> Feature:
792792

793793
@property
794794
def data(self):
795-
return self._get_merged_feature.data
795+
return self._get_merged_feature().data
796796

797797
@property
798798
def indexing_attributes(self) -> Tuple[str]:

siibra/features/tabular/cortical_profile.py

+15-7
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,11 @@ def _layers(self):
161161
def data(self):
162162
"""Return a pandas Series representing the profile."""
163163
self._check_sanity()
164-
return pd.DataFrame(
165-
self._values, index=self._depths, columns=[f"{self.modality} ({self.unit})"]
166-
)
164+
if self._values.shape[1] == 2:
165+
columns = [f"{self.modality} mean ({self.unit})", "std"]
166+
else:
167+
columns = [f"{self.modality} ({self.unit})"]
168+
return pd.DataFrame(self._values, index=self._depths, columns=columns)
167169

168170
@classmethod
169171
def _merge_elements(
@@ -175,12 +177,13 @@ def _merge_elements(
175177
):
176178
assert all(np.array_equal(elements[0]._depths, f._depths) for f in elements)
177179
assert len({f.unit for f in elements}) == 1
180+
values_stacked = np.stack([f._values for f in elements])
178181
return CorticalProfile(
179182
description=description,
180183
modality=modality,
181184
anchor=anchor,
182-
depths=elements[0]._depths,
183-
values=np.stack([f._values for f in elements]).mean(0),
185+
depths=np.stack([f._depths for f in elements]).mean(0),
186+
values=np.stack([values_stacked.mean(0), values_stacked.std(0)]).T,
184187
unit=elements[0].unit,
185188
boundary_positions=None,
186189
)
@@ -202,11 +205,14 @@ def plot(self, *args, backend="matplotlib", **kwargs):
202205
kwargs["title"] = kwargs.get("title", "\n".join(wrap(self.name, wrapwidth)))
203206
layercolor = kwargs.pop("layercolor", "gray")
204207

208+
ymax = max(0, self._values.max() if self._values.shape[1] == 1 else self._values[:, 0].max() + self._values[:, 1].max())
205209
if backend == "matplotlib":
210+
if self._values.shape[1] == 2:
211+
kwargs["yerr"] = kwargs.get("yerr", "std")
206212
kwargs["xlabel"] = kwargs.get("xlabel", "Cortical depth")
207213
kwargs["ylabel"] = kwargs.get("ylabel", self.unit)
208214
kwargs["grid"] = kwargs.get("grid", True)
209-
kwargs["ylim"] = kwargs.get("ylim", (0, max(self._values)))
215+
kwargs["ylim"] = kwargs.get("ylim", ymax),
210216
axs = self.data.plot(*args, **kwargs, backend=backend)
211217

212218
if self.boundaries_mapped:
@@ -225,6 +231,8 @@ def plot(self, *args, backend="matplotlib", **kwargs):
225231
axs.set_title(axs.get_title(), fontsize="medium")
226232
return axs
227233
elif backend == "plotly":
234+
if self._values.shape[1] == 2:
235+
kwargs["error_y"] = kwargs.get("error_y", "std")
228236
kwargs["title"] = kwargs["title"].replace("\n", "<br>")
229237
kwargs["labels"] = {
230238
"index": kwargs.pop("xlabel", None) or kwargs.pop("index", "Cortical depth"),
@@ -241,7 +249,7 @@ def plot(self, *args, backend="matplotlib", **kwargs):
241249
)
242250
fig.update_layout(
243251
showlegend=False,
244-
yaxis_range=(0, max(self._values)),
252+
yaxis_range=(0, ymax),
245253
title=dict(
246254
automargin=True, yref="container", xref="container",
247255
pad=dict(t=40), xanchor="left", yanchor="top"

0 commit comments

Comments
 (0)