diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index e0b23ba7..6cd3250e 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -59,7 +59,7 @@ jobs: pytest -v --cov --color=yes --cov-report=xml - name: Archive figures generated during testing if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: visual_test_results_${{ matrix.os }}-python${{ matrix.python }} path: /home/runner/work/spatialdata-plot/spatialdata-plot/tests/figures/* diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b055853a..eb286b32 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,8 +12,8 @@ repos: rev: 24.10.0 hooks: - id: black - - repo: https://github.com/pre-commit/mirrors-prettier - rev: v4.0.0-alpha.8 + - repo: https://github.com/rbubley/mirrors-prettier + rev: v3.5.0 hooks: - id: prettier - repo: https://github.com/asottile/blacken-docs diff --git a/src/spatialdata_plot/pl/render.py b/src/spatialdata_plot/pl/render.py index 5bafe7a8..d44b90d5 100644 --- a/src/spatialdata_plot/pl/render.py +++ b/src/spatialdata_plot/pl/render.py @@ -19,7 +19,7 @@ from scanpy._settings import settings as sc_settings from spatialdata import get_extent, get_values, join_spatialelement_table from spatialdata.models import PointsModel, ShapesModel, get_table_keys -from spatialdata.transformations import get_transformation, set_transformation +from spatialdata.transformations import set_transformation from spatialdata.transformations.transformations import Identity from xarray import DataTree @@ -43,7 +43,6 @@ _get_colors_for_categorical_obs, _get_extent_and_range_for_datashader_canvas, _get_linear_colormap, - _get_transformation_matrix_for_datashader, _is_coercable_to_float, _map_color_seg, _maybe_set_colors, @@ -184,10 +183,9 @@ def _render_shapes( sdata_filt.shapes[element].loc[is_point, "geometry"] = _geometry[is_point].buffer(scale.to_numpy()) # apply transformations to the individual points - element_trans = get_transformation(sdata_filt.shapes[element]) - tm = _get_transformation_matrix_for_datashader(element_trans) + tm = trans.get_matrix() transformed_element = sdata_filt.shapes[element].transform( - lambda x: (np.hstack([x, np.ones((x.shape[0], 1))]) @ tm)[:, :2] + lambda x: (np.hstack([x, np.ones((x.shape[0], 1))]) @ tm.T)[:, :2] ) transformed_element = ShapesModel.parse( gpd.GeoDataFrame(data=sdata_filt.shapes[element].drop("geometry", axis=1), geometry=transformed_element) diff --git a/src/spatialdata_plot/pl/utils.py b/src/spatialdata_plot/pl/utils.py index 03941dd8..f5cc3d79 100644 --- a/src/spatialdata_plot/pl/utils.py +++ b/src/spatialdata_plot/pl/utils.py @@ -19,7 +19,6 @@ import matplotlib.transforms as mtransforms import numpy as np import numpy.ma as ma -import numpy.typing as npt import pandas as pd import shapely import spatialdata as sd @@ -59,11 +58,8 @@ from spatialdata._core.query.relational_query import _locate_value from spatialdata._types import ArrayLike from spatialdata.models import Image2DModel, Labels2DModel, SpatialElement - -# from spatialdata.transformations.transformations import Scale -from spatialdata.transformations import Affine, Identity, MapAxis, Scale, Translation -from spatialdata.transformations import Sequence as SDSequence from spatialdata.transformations.operations import get_transformation +from spatialdata.transformations.transformations import Scale from xarray import DataArray, DataTree from spatialdata_plot._logging import logger @@ -2235,34 +2231,3 @@ def _prepare_transformation( trans_data = trans + ax.transData if ax is not None else None return trans, trans_data - - -def _get_datashader_trans_matrix_of_single_element( - trans: Identity | Scale | Affine | MapAxis | Translation, -) -> npt.NDArray[Any]: - flip_matrix = np.array([[1, 0, 0], [0, -1, 0], [0, 0, 1]]) - tm: npt.NDArray[Any] = trans.to_affine_matrix(("x", "y"), ("x", "y")) - - if isinstance(trans, Identity): - return np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) - if isinstance(trans, (Scale | Affine)): - # idea: "flip the y-axis", apply transformation, flip back - flip_and_transform: npt.NDArray[Any] = flip_matrix @ tm @ flip_matrix - return flip_and_transform - if isinstance(trans, MapAxis): - # no flipping needed - return tm - # for a Translation, we need the transposed transformation matrix - return tm.T - - -def _get_transformation_matrix_for_datashader( - trans: Scale | Identity | Affine | MapAxis | Translation | SDSequence, -) -> npt.NDArray[Any]: - """Get the affine matrix needed to transform shapes for rendering with datashader.""" - if isinstance(trans, SDSequence): - tm = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) - for x in trans.transformations: - tm = tm @ _get_datashader_trans_matrix_of_single_element(x) - return tm - return _get_datashader_trans_matrix_of_single_element(trans)