def METHOD_NAME(self, data_array):
    """
    Apply `data_func`, then linearly scale to the unit interval, and
    then apply `unit_func`.
    """
    # FIXME: Deal with nans?
    if self._dirty:
        self._recalculate()
    if self.data_func is not None:
        data_array = self.data_func(data_array)
        low, high = self.transformed_bounds
    else:
        low, high = self.range.low, self.range.high
    range_diff = high - low
    # Linearly transform the values to the unit interval.
    if range_diff == 0.0 or isinf(range_diff):
        # Handle null range, or infinite range (which can happen during
        # initialization before range is connected to a data source).
        norm_data = 0.5 * ones_like(data_array)
    else:
        norm_data = empty(data_array.shape, dtype="float32")
        norm_data[:] = data_array
        norm_data -= low
        norm_data /= range_diff
        clip(norm_data, 0.0, 1.0, norm_data)
    if self.unit_func is not None:
        norm_data = self.unit_func(norm_data)
    return norm_data