Skip to content

Commit 0d5f729

Browse files
authored
make ready for new spatialdata (#482)
1 parent e770345 commit 0d5f729

File tree

6 files changed

+42
-38
lines changed

6 files changed

+42
-38
lines changed

src/spatialdata_plot/pl/utils.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -780,8 +780,9 @@ def _set_color_source_vec(
780780

781781
color_source_vector = pd.Categorical(color_source_vector) # convert, e.g., `pd.Series`
782782

783+
# TODO check why table_name is not passed here.
783784
color_mapping = _get_categorical_color_mapping(
784-
adata=sdata.table,
785+
adata=sdata["table"],
785786
cluster_key=value_to_plot,
786787
color_source_vector=color_source_vector,
787788
cmap_params=cmap_params,

tests/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ def test_sdata_multiple_images_diverging_dims():
154154
def sdata_blobs_shapes_annotated() -> SpatialData:
155155
"""Get blobs sdata with continuous annotation of polygons."""
156156
blob = blobs()
157-
blob["table"].obs["region"] = "blobs_polygons"
157+
blob["table"].obs["region"] = pd.Categorical(["blobs_polygons"] * blob["table"].n_obs)
158158
blob["table"].uns["spatialdata_attrs"]["region"] = "blobs_polygons"
159159
blob.shapes["blobs_polygons"]["value"] = [1, 2, 3, 4, 5]
160160
return blob

tests/pl/test_render_labels.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,12 @@ def test_plot_can_render_labels(self, sdata_blobs: SpatialData):
3333
sdata_blobs.pl.render_labels(element="blobs_labels").pl.show()
3434

3535
def test_plot_can_render_multiscale_labels(self, sdata_blobs: SpatialData):
36-
sdata_blobs["table"].obs["region"] = "blobs_multiscale_labels"
36+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_multiscale_labels"] * sdata_blobs["table"].n_obs)
3737
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_multiscale_labels"
3838
sdata_blobs.pl.render_labels("blobs_multiscale_labels").pl.show()
3939

4040
def test_plot_can_render_given_scale_of_multiscale_labels(self, sdata_blobs: SpatialData):
41-
sdata_blobs["table"].obs["region"] = "blobs_multiscale_labels"
41+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_multiscale_labels"] * sdata_blobs["table"].n_obs)
4242
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_multiscale_labels"
4343
sdata_blobs.pl.render_labels("blobs_multiscale_labels", scale="scale1").pl.show()
4444

@@ -50,7 +50,7 @@ def test_plot_can_do_rasterization(self, sdata_blobs: SpatialData):
5050
img.attrs["transform"] = sdata_blobs["blobs_labels"].transform
5151
sdata_blobs["blobs_giant_labels"] = img
5252

53-
sdata_blobs["table"].obs["region"] = "blobs_giant_labels"
53+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_giant_labels"] * sdata_blobs["table"].n_obs)
5454
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_giant_labels"
5555

5656
sdata_blobs.pl.render_labels("blobs_giant_labels").pl.show()
@@ -63,7 +63,7 @@ def test_plot_can_stop_rasterization_with_scale_full(self, sdata_blobs: SpatialD
6363
img.attrs["transform"] = sdata_blobs["blobs_labels"].transform
6464
sdata_blobs["blobs_giant_labels"] = img
6565

66-
sdata_blobs["table"].obs["region"] = "blobs_giant_labels"
66+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_giant_labels"] * sdata_blobs["table"].n_obs)
6767
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_giant_labels"
6868

6969
sdata_blobs.pl.render_labels("blobs_giant_labels", scale="full").pl.show()
@@ -110,7 +110,7 @@ def _make_tablemodel_with_categorical_labels(sdata_blobs, label):
110110
max_col = max_col.str.replace("channel_", "ch").str.replace("_sum", "")
111111
max_col = pd.Categorical(max_col, categories=set(max_col), ordered=True)
112112
adata.obs["which_max"] = max_col
113-
adata.obs["region"] = label
113+
adata.obs["region"] = pd.Categorical([label] * adata.n_obs)
114114
del adata.uns["spatialdata_attrs"]
115115
table = TableModel.parse(
116116
adata=adata,
@@ -142,7 +142,7 @@ def test_plot_two_calls_with_coloring_result_in_two_colorbars(self, sdata_blobs:
142142
sdata_blobs_local = deepcopy(sdata_blobs)
143143

144144
table = sdata_blobs_local["table"].copy()
145-
table.obs["region"] = "blobs_multiscale_labels"
145+
table.obs["region"] = pd.Categorical(["blobs_multiscale_labels"] * table.n_obs)
146146
table.uns["spatialdata_attrs"]["region"] = "blobs_multiscale_labels"
147147
table = table[:, ~table.var_names.isin(["channel_0_sum"])]
148148
sdata_blobs_local["multi_table"] = table
@@ -187,7 +187,7 @@ def test_plot_label_colorbar_uses_alpha_of_less_transparent_outline(
187187

188188
def test_can_plot_with_one_element_color_table(self, sdata_blobs: SpatialData):
189189
table = sdata_blobs["table"].copy()
190-
table.obs["region"] = "blobs_multiscale_labels"
190+
table.obs["region"] = pd.Categorical(["blobs_multiscale_labels"] * table.n_obs)
191191
table.uns["spatialdata_attrs"]["region"] = "blobs_multiscale_labels"
192192
table = table[:, ~table.var_names.isin(["channel_0_sum"])]
193193
sdata_blobs["multi_table"] = table
@@ -196,9 +196,9 @@ def test_can_plot_with_one_element_color_table(self, sdata_blobs: SpatialData):
196196
).pl.show()
197197

198198
def test_plot_subset_categorical_label_maintains_order(self, sdata_blobs: SpatialData):
199-
max_col = sdata_blobs.table.to_df().idxmax(axis=1)
200-
max_col = pd.Categorical(max_col, categories=sdata_blobs.table.to_df().columns, ordered=True)
201-
sdata_blobs.table.obs["which_max"] = max_col
199+
max_col = sdata_blobs["table"].to_df().idxmax(axis=1)
200+
max_col = pd.Categorical(max_col, categories=sdata_blobs["table"].to_df().columns, ordered=True)
201+
sdata_blobs["table"].obs["which_max"] = max_col
202202

203203
_, axs = plt.subplots(nrows=1, ncols=2, layout="tight")
204204

@@ -210,9 +210,9 @@ def test_plot_subset_categorical_label_maintains_order(self, sdata_blobs: Spatia
210210
).pl.show(ax=axs[1])
211211

212212
def test_plot_subset_categorical_label_maintains_order_when_palette_overwrite(self, sdata_blobs: SpatialData):
213-
max_col = sdata_blobs.table.to_df().idxmax(axis=1)
214-
max_col = pd.Categorical(max_col, categories=sdata_blobs.table.to_df().columns, ordered=True)
215-
sdata_blobs.table.obs["which_max"] = max_col
213+
max_col = sdata_blobs["table"].to_df().idxmax(axis=1)
214+
max_col = pd.Categorical(max_col, categories=sdata_blobs["table"].to_df().columns, ordered=True)
215+
sdata_blobs["table"].obs["which_max"] = max_col
216216

217217
_, axs = plt.subplots(nrows=1, ncols=2, layout="tight")
218218

tests/pl/test_render_points.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def test_plot_can_render_points(self, sdata_blobs: SpatialData):
3737
def test_plot_can_filter_with_groups_default_palette(self, sdata_blobs: SpatialData):
3838
_, axs = plt.subplots(nrows=1, ncols=2, layout="tight")
3939

40-
sdata_blobs["table"].obs["region"] = ["blobs_points"] * sdata_blobs["table"].n_obs
40+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_points"] * sdata_blobs["table"].n_obs)
4141
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_points"
4242

4343
sdata_blobs.pl.render_points(color="genes", size=10).pl.show(ax=axs[0], legend_fontsize=6)
@@ -46,7 +46,7 @@ def test_plot_can_filter_with_groups_default_palette(self, sdata_blobs: SpatialD
4646
def test_plot_can_filter_with_groups_custom_palette(self, sdata_blobs: SpatialData):
4747
_, axs = plt.subplots(nrows=1, ncols=2, layout="tight")
4848

49-
sdata_blobs["table"].obs["region"] = ["blobs_points"] * sdata_blobs["table"].n_obs
49+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_points"] * sdata_blobs["table"].n_obs)
5050
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_points"
5151

5252
sdata_blobs.pl.render_points(color="genes", size=10).pl.show(ax=axs[0], legend_fontsize=6)
@@ -55,19 +55,19 @@ def test_plot_can_filter_with_groups_custom_palette(self, sdata_blobs: SpatialDa
5555
)
5656

5757
def test_plot_coloring_with_palette(self, sdata_blobs: SpatialData):
58-
sdata_blobs["table"].obs["region"] = ["blobs_points"] * sdata_blobs["table"].n_obs
58+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_points"] * sdata_blobs["table"].n_obs)
5959
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_points"
6060
sdata_blobs.pl.render_points(
6161
color="genes", groups=["gene_a", "gene_b"], palette=["lightgreen", "darkblue"]
6262
).pl.show()
6363

6464
def test_plot_coloring_with_cmap(self, sdata_blobs: SpatialData):
65-
sdata_blobs["table"].obs["region"] = ["blobs_points"] * sdata_blobs["table"].n_obs
65+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_points"] * sdata_blobs["table"].n_obs)
6666
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_points"
6767
sdata_blobs.pl.render_points(color="genes", cmap="rainbow").pl.show()
6868

6969
def test_plot_can_stack_render_points(self, sdata_blobs: SpatialData):
70-
sdata_blobs["table"].obs["region"] = ["blobs_points"] * sdata_blobs["table"].n_obs
70+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_points"] * sdata_blobs["table"].n_obs)
7171
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_points"
7272
(
7373
sdata_blobs.pl.render_points(element="blobs_points", na_color="red", size=30)
@@ -86,7 +86,7 @@ def test_plot_points_coercable_categorical_color(self, sdata_blobs: SpatialData)
8686
adata.obs["instance_id"] = np.arange(adata.n_obs)
8787
adata.obs["category"] = RNG.choice(["a", "b", "c"], size=adata.n_obs)
8888
adata.obs["instance_id"] = list(range(adata.n_obs))
89-
adata.obs["region"] = "blobs_points"
89+
adata.obs["region"] = pd.Categorical(["blobs_points"] * adata.n_obs)
9090
table = TableModel.parse(adata=adata, region_key="region", instance_key="instance_id", region="blobs_points")
9191
sdata_blobs["other_table"] = table
9292

@@ -100,7 +100,7 @@ def test_plot_points_categorical_color(self, sdata_blobs: SpatialData):
100100
adata.obs["instance_id"] = np.arange(adata.n_obs)
101101
adata.obs["category"] = RNG.choice(["a", "b", "c"], size=adata.n_obs)
102102
adata.obs["instance_id"] = list(range(adata.n_obs))
103-
adata.obs["region"] = "blobs_points"
103+
adata.obs["region"] = pd.Categorical(["blobs_points"] * adata.n_obs)
104104
table = TableModel.parse(adata=adata, region_key="region", instance_key="instance_id", region="blobs_points")
105105
sdata_blobs["other_table"] = table
106106

tests/pl/test_render_shapes.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ def _make_multi():
101101

102102
def test_plot_can_color_from_geodataframe(self, sdata_blobs: SpatialData):
103103
blob = deepcopy(sdata_blobs)
104-
blob["table"].obs["region"] = "blobs_polygons"
104+
blob["table"].obs["region"] = pd.Categorical(["blobs_polygons"] * blob["table"].n_obs)
105105
blob["table"].uns["spatialdata_attrs"]["region"] = "blobs_polygons"
106106
blob.shapes["blobs_polygons"]["value"] = [1, 10, 1, 20, 1]
107107
blob.pl.render_shapes(
@@ -115,7 +115,7 @@ def test_plot_can_scale_shapes(self, sdata_blobs: SpatialData):
115115
def test_plot_can_filter_with_groups(self, sdata_blobs: SpatialData):
116116
_, axs = plt.subplots(nrows=1, ncols=2, layout="tight")
117117

118-
sdata_blobs["table"].obs["region"] = "blobs_polygons"
118+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_polygons"] * sdata_blobs["table"].n_obs)
119119
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_polygons"
120120
sdata_blobs.shapes["blobs_polygons"]["cluster"] = "c1"
121121
sdata_blobs.shapes["blobs_polygons"].iloc[3:5, 1] = "c2"
@@ -129,7 +129,7 @@ def test_plot_can_filter_with_groups(self, sdata_blobs: SpatialData):
129129
)
130130

131131
def test_plot_coloring_with_palette(self, sdata_blobs: SpatialData):
132-
sdata_blobs["table"].obs["region"] = "blobs_polygons"
132+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_polygons"] * sdata_blobs["table"].n_obs)
133133
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_polygons"
134134
sdata_blobs.shapes["blobs_polygons"]["cluster"] = "c1"
135135
sdata_blobs.shapes["blobs_polygons"].iloc[3:5, 1] = "c2"
@@ -142,21 +142,21 @@ def test_plot_coloring_with_palette(self, sdata_blobs: SpatialData):
142142
).pl.show()
143143

144144
def test_plot_colorbar_respects_input_limits(self, sdata_blobs: SpatialData):
145-
sdata_blobs["table"].obs["region"] = "blobs_polygons"
145+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_polygons"] * sdata_blobs["table"].n_obs)
146146
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_polygons"
147147
sdata_blobs.shapes["blobs_polygons"]["cluster"] = [1, 2, 3, 5, 20]
148148
sdata_blobs.pl.render_shapes("blobs_polygons", color="cluster").pl.show()
149149

150150
def test_plot_colorbar_can_be_normalised(self, sdata_blobs: SpatialData):
151-
sdata_blobs["table"].obs["region"] = "blobs_polygons"
151+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_polygons"] * sdata_blobs["table"].n_obs)
152152
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_polygons"
153153
sdata_blobs.shapes["blobs_polygons"]["cluster"] = [1, 2, 3, 5, 20]
154154
norm = Normalize(vmin=0, vmax=5, clip=True)
155155
sdata_blobs.pl.render_shapes("blobs_polygons", color="cluster", groups=["c1"], norm=norm).pl.show()
156156

157157
def test_plot_can_plot_shapes_after_spatial_query(self, sdata_blobs: SpatialData):
158158
# subset to only shapes, should be unnecessary after rasterizeation of multiscale images is included
159-
blob = SpatialData.from_elements_dict(
159+
blob = SpatialData.init_from_elements(
160160
{
161161
"blobs_circles": sdata_blobs.shapes["blobs_circles"],
162162
"blobs_multipolygons": sdata_blobs.shapes["blobs_multipolygons"],
@@ -169,7 +169,7 @@ def test_plot_can_plot_shapes_after_spatial_query(self, sdata_blobs: SpatialData
169169
cropped_blob.pl.render_shapes().pl.show()
170170

171171
def test_plot_can_plot_with_annotation_despite_random_shuffling(self, sdata_blobs: SpatialData):
172-
sdata_blobs["table"].obs["region"] = "blobs_circles"
172+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_circles"] * sdata_blobs["table"].n_obs)
173173
new_table = sdata_blobs["table"][:5]
174174
new_table.uns["spatialdata_attrs"]["region"] = "blobs_circles"
175175
new_table.obs["instance_id"] = np.array(range(5))
@@ -188,7 +188,7 @@ def test_plot_can_plot_with_annotation_despite_random_shuffling(self, sdata_blob
188188
sdata_blobs.pl.render_shapes("blobs_circles", color="annotation").pl.show()
189189

190190
def test_plot_can_plot_queried_with_annotation_despite_random_shuffling(self, sdata_blobs: SpatialData):
191-
sdata_blobs["table"].obs["region"] = "blobs_circles"
191+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_circles"] * sdata_blobs["table"].n_obs)
192192
new_table = sdata_blobs["table"][:5].copy()
193193
new_table.uns["spatialdata_attrs"]["region"] = "blobs_circles"
194194
new_table.obs["instance_id"] = np.array(range(5))
@@ -216,11 +216,12 @@ def test_plot_can_plot_queried_with_annotation_despite_random_shuffling(self, sd
216216
sdata_cropped.pl.render_shapes("blobs_circles", color="annotation").pl.show()
217217

218218
def test_plot_can_color_two_shapes_elements_by_annotation(self, sdata_blobs: SpatialData):
219-
sdata_blobs["table"].obs["region"] = "blobs_circles"
219+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_circles"] * sdata_blobs["table"].n_obs)
220220
new_table = sdata_blobs["table"][:10].copy()
221221
new_table.uns["spatialdata_attrs"]["region"] = ["blobs_circles", "blobs_polygons"]
222222
new_table.obs["instance_id"] = np.concatenate((np.array(range(5)), np.array(range(5))))
223223

224+
new_table.obs["region"] = new_table.obs["region"].cat.add_categories(["blobs_polygons"])
224225
new_table.obs.loc[5 * [False] + 5 * [True], "region"] = "blobs_polygons"
225226
new_table.obs["annotation"] = ["a", "b", "c", "d", "e", "v", "w", "x", "y", "z"]
226227
new_table.obs["annotation"] = new_table.obs["annotation"].astype("category")
@@ -232,11 +233,12 @@ def test_plot_can_color_two_shapes_elements_by_annotation(self, sdata_blobs: Spa
232233
).pl.show()
233234

234235
def test_plot_can_color_two_queried_shapes_elements_by_annotation(self, sdata_blobs: SpatialData):
235-
sdata_blobs["table"].obs["region"] = "blobs_circles"
236+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_circles"] * sdata_blobs["table"].n_obs)
236237
new_table = sdata_blobs["table"][:10].copy()
237238
new_table.uns["spatialdata_attrs"]["region"] = ["blobs_circles", "blobs_polygons"]
238239
new_table.obs["instance_id"] = np.concatenate((np.array(range(5)), np.array(range(5))))
239240

241+
new_table.obs["region"] = new_table.obs["region"].cat.add_categories(["blobs_polygons"])
240242
new_table.obs.loc[5 * [False] + 5 * [True], "region"] = "blobs_polygons"
241243
new_table.obs["annotation"] = ["a", "b", "c", "d", "e", "v", "w", "x", "y", "z"]
242244
new_table.obs["annotation"] = new_table.obs["annotation"].astype("category")
@@ -364,7 +366,7 @@ def test_plot_can_color_by_category_with_cmap(self, sdata_blobs: SpatialData):
364366
sdata_blobs.pl.render_shapes(element="blobs_polygons", color="category", cmap="cool").pl.show()
365367

366368
def test_plot_datashader_can_color_by_value(self, sdata_blobs: SpatialData):
367-
sdata_blobs["table"].obs["region"] = "blobs_polygons"
369+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_polygons"] * sdata_blobs["table"].n_obs)
368370
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_polygons"
369371
sdata_blobs.shapes["blobs_polygons"]["value"] = [1, 10, 1, 20, 1]
370372
sdata_blobs.pl.render_shapes(element="blobs_polygons", color="value", method="datashader").pl.show()
@@ -374,13 +376,13 @@ def test_plot_datashader_can_color_by_identical_value(self, sdata_blobs: Spatial
374376
We test this, because datashader internally scales the values, so when all shapes have the same value,
375377
the scaling would lead to all of them being assigned an alpha of 0, so we wouldn't see anything
376378
"""
377-
sdata_blobs["table"].obs["region"] = ["blobs_polygons"] * sdata_blobs["table"].n_obs
379+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_polygons"] * sdata_blobs["table"].n_obs)
378380
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_polygons"
379381
sdata_blobs.shapes["blobs_polygons"]["value"] = [1, 1, 1, 1, 1]
380382
sdata_blobs.pl.render_shapes(element="blobs_polygons", color="value", method="datashader").pl.show()
381383

382384
def test_plot_datashader_shades_with_linear_cmap(self, sdata_blobs: SpatialData):
383-
sdata_blobs["table"].obs["region"] = ["blobs_polygons"] * sdata_blobs["table"].n_obs
385+
sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_polygons"] * sdata_blobs["table"].n_obs)
384386
sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_polygons"
385387
sdata_blobs.shapes["blobs_polygons"]["value"] = [1, 2, 1, 20, 1]
386388
sdata_blobs.pl.render_shapes(element="blobs_polygons", color="value", method="datashader").pl.show()
@@ -414,7 +416,7 @@ def test_plot_datashader_can_render_with_rgba_colored_outline(self, sdata_blobs:
414416
def test_plot_can_set_clims_clip(self, sdata_blobs: SpatialData):
415417
table_shapes = sdata_blobs["table"][:5].copy()
416418
table_shapes.obs.instance_id = list(range(5))
417-
table_shapes.obs["region"] = "blobs_circles"
419+
table_shapes.obs["region"] = pd.Categorical(["blobs_circles"] * table_shapes.n_obs)
418420
table_shapes.obs["dummy_gene_expression"] = [i * 10 for i in range(5)]
419421
table_shapes.uns["spatialdata_attrs"]["region"] = "blobs_circles"
420422
sdata_blobs["new_table"] = table_shapes
@@ -493,7 +495,7 @@ def test_plot_datashader_can_transform_circles(self, sdata_blobs: SpatialData):
493495
def test_plot_can_do_non_matching_table(self, sdata_blobs: SpatialData):
494496
table_shapes = sdata_blobs["table"][:3].copy()
495497
table_shapes.obs.instance_id = list(range(3))
496-
table_shapes.obs["region"] = "blobs_circles"
498+
table_shapes.obs["region"] = pd.Categorical(["blobs_circles"] * table_shapes.n_obs)
497499
table_shapes.uns["spatialdata_attrs"]["region"] = "blobs_circles"
498500
sdata_blobs["new_table"] = table_shapes
499501

0 commit comments

Comments
 (0)