def METHOD_NAME(self, x_new):
    """Rotates a strain map to a new basis.
    Parameters
    ----------
    x_new : list
        The coordinates of a point on the new 'x' axis
    Returns
    -------
    StrainMap :
        StrainMap in the new (rotated) basis.
    Notes
    -----
    Conventions are described in the class documentation.
    We follow mathmatical formalism described in:
    "https://www.continuummechanics.org/stressxforms.html" (August 2019)
    """
    def apply_rotation(transposed_strain_map, R):
        """Rotates a strain matrix to a new basis, for which R maps x_old to x_new."""
        sigmaxx_old = transposed_strain_map[0]
        sigmayy_old = transposed_strain_map[1]
        sigmaxy_old = transposed_strain_map[2]
        z = np.asarray([[sigmaxx_old, sigmaxy_old], [sigmaxy_old, sigmayy_old]])
        new = np.matmul(R.T, np.matmul(z, R))
        return [new[0, 0], new[1, 1], new[0, 1], transposed_strain_map[3]]
    def apply_rotation_complete(self, R):
        """Mapping solution to return a (unclassed) strain map in a new basis."""
        from hyperspy.api import transpose
        transposed = transpose(self)[0]
        transposed_to_new_basis = transposed.map(apply_rotation, R=R, inplace=False)
        return transposed_to_new_basis.T
    """Core functionality."""
    if self.current_basis_x != [1, 0]:
        # this takes us back to [1,0] if our current map is in a diferent basis
        R = _get_rotation_matrix(self.current_basis_x).T
        strain_map_core = apply_rotation_complete(self, R)
    else:
        strain_map_core = self
    R = _get_rotation_matrix(x_new)
    transposed_to_new_basis = apply_rotation_complete(strain_map_core, R)
    meta_dict = self.metadata.as_dictionary()
    strainmap = StrainMap(
        transposed_to_new_basis, current_basis_x=x_new, metadata=meta_dict
    )
    return transfer_signal_axes(strainmap, self)