Compute alpha shapes for each cluster in the cell metadata.
Parameters:
- meta_cell: GeoDataFrame of cell metadata.
- cat: Column name in meta_cell containing the cluster labels.
- alphas: List of alpha values to compute shapes for.
Returns:
- GeoDataFrame of alpha shapes.
Source code in src/celldega/nbhd/__init__.py
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178 | def alpha_shape_cell_clusters(meta_cell, cat='cluster', alphas=[100, 150, 200, 250, 300, 350]):
"""
Compute alpha shapes for each cluster in the cell metadata.
Parameters:
- meta_cell: GeoDataFrame of cell metadata.
- cat: Column name in meta_cell containing the cluster labels.
- alphas: List of alpha values to compute shapes for.
Returns:
- GeoDataFrame of alpha shapes.
"""
gdf_alpha = gpd.GeoDataFrame()
for inv_alpha in alphas:
for inst_cluster in meta_cell[cat].unique():
inst_clust = meta_cell[meta_cell[cat] == inst_cluster]
if inst_clust.shape[0]> 3:
nested_array = inst_clust['geometry'].values
# Convert to a 2D NumPy array
flat_array = np.vstack(nested_array)
inst_shape = alpha_shape(flat_array, inv_alpha)
inst_name = inst_cluster + '_' + str(inv_alpha)
gdf_alpha.loc[inst_name, 'name'] = inst_name
gdf_alpha.loc[inst_name, 'cat'] = inst_cluster
gdf_alpha.loc[inst_name, 'geometry'] = inst_shape
gdf_alpha.loc[inst_name, 'inv_alpha'] = int(inv_alpha)
gdf_alpha["geometry"] = gdf_alpha["geometry"].apply(lambda geom: _round_coordinates(geom, precision=2))
gdf_alpha['area'] = gdf_alpha.area
gdf_alpha = gdf_alpha.loc[gdf_alpha.area.sort_values(ascending=False).index.tolist()]
return gdf_alpha
|