Exemplo n.º 1
0
    def prepare_values(self, raw, offset=0):
        """Prepare the values to start with sane values"""
        from pygal.graph.map import BaseMap
        from pygal import Histogram

        if self.zero == 0 and isinstance(self, BaseMap):
            self.zero = 1

        if self.x_label_rotation:
            self.x_label_rotation %= 360

        if self.y_label_rotation:
            self.y_label_rotation %= 360

        for key in ('x_labels', 'y_labels'):
            if getattr(self, key):
                setattr(self, key, list(getattr(self, key)))
        if not raw:
            return

        adapters = list(self._adapters) or [lambda x: x]
        if self.logarithmic:
            for fun in not_zero, positive:
                if fun in adapters:
                    adapters.remove(fun)
            adapters = adapters + [positive, not_zero]
        adapters = adapters + [decimal_to_float]

        self._adapt = reduce(compose, adapters) if not self.strict else ident
        self._x_adapt = reduce(
            compose, self._x_adapters) if not self.strict and getattr(
                self, '_x_adapters', None) else ident

        series = []

        raw = [(list(raw_values) if not isinstance(raw_values, dict) else
                raw_values, serie_config_kwargs)
               for raw_values, serie_config_kwargs in raw]

        width = max([len(values)
                     for values, _ in raw] + [len(self.x_labels or [])])

        for raw_values, serie_config_kwargs in raw:
            metadata = {}
            values = []
            if isinstance(raw_values, dict):
                if isinstance(self, BaseMap):
                    raw_values = list(raw_values.items())
                else:
                    value_list = [None] * width
                    for k, v in raw_values.items():
                        if k in (self.x_labels or []):
                            value_list[self.x_labels.index(k)] = v
                    raw_values = value_list

            for index, raw_value in enumerate(raw_values + (
                (width - len(raw_values)) * [None]  # aligning values
                    if len(raw_values) < width else [])):
                if isinstance(raw_value, dict):
                    raw_value = dict(raw_value)
                    value = raw_value.pop('value', None)
                    metadata[index] = raw_value
                else:
                    value = raw_value

                # Fix this by doing this in charts class methods
                if isinstance(self, Histogram):
                    if value is None:
                        value = (None, None, None)
                    elif not is_list_like(value):
                        value = (value, self.zero, self.zero)
                    elif len(value) == 2:
                        value = (1, value[0], value[1])
                    value = list(map(self._adapt, value))
                elif self._dual:
                    if value is None:
                        value = (None, None)
                    elif not is_list_like(value):
                        value = (value, self.zero)
                    if self._x_adapt:
                        value = (self._x_adapt(value[0]),
                                 self._adapt(value[1]))
                    if isinstance(self, BaseMap):
                        value = (self._adapt(value[0]), value[1])
                    else:
                        value = list(map(self._adapt, value))
                else:
                    value = self._adapt(value)

                values.append(value)
            serie_config = SerieConfig()
            serie_config(**dict((k, v) for k, v in self.state.__dict__.items()
                                if k in dir(serie_config)))
            serie_config(**serie_config_kwargs)
            series.append(
                Serie(offset + len(series), values, serie_config, metadata))
        return series
Exemplo n.º 2
0
def prepare_values(raw, config, cls, offset=0):
    """Prepare the values to start with sane values"""
    from pygal.serie import Serie
    from pygal.config import SerieConfig
    from pygal.graph.time import DateY
    from pygal.graph.histogram import Histogram
    from pygal.graph.worldmap import Worldmap
    from pygal.graph.frenchmap import FrenchMapDepartments
    if config.x_labels is None and hasattr(cls, 'x_labels'):
        config.x_labels = list(map(to_unicode, cls.x_labels))
    if config.zero == 0 and issubclass(cls, (Worldmap, FrenchMapDepartments)):
        config.zero = 1

    for key in ('x_labels', 'y_labels'):
        if getattr(config, key):
            setattr(config, key, list(getattr(config, key)))
    if not raw:
        return

    adapters = list(cls._adapters) or [lambda x:x]
    if config.logarithmic:
        for fun in not_zero, positive:
            if fun in adapters:
                adapters.remove(fun)
        adapters = adapters + [positive, not_zero]
    adapters = adapters + [decimal_to_float]
    adapter = reduce(compose, adapters) if not config.strict else ident
    x_adapter = reduce(
        compose, cls._x_adapters) if getattr(
            cls, '_x_adapters', None) else None
    series = []

    raw = [(
        title,
        list(raw_values) if not isinstance(raw_values, dict) else raw_values,
        serie_config_kwargs
    ) for title, raw_values, serie_config_kwargs in raw]

    width = max([len(values) for _, values, _ in raw] +
                [len(config.x_labels or [])])

    for title, raw_values, serie_config_kwargs in raw:
        metadata = {}
        values = []
        if isinstance(raw_values, dict):
            if issubclass(cls, (Worldmap, FrenchMapDepartments)):
                raw_values = list(raw_values.items())
            else:
                value_list = [None] * width
                for k, v in raw_values.items():
                    if k in config.x_labels:
                        value_list[config.x_labels.index(k)] = v
                raw_values = value_list

        for index, raw_value in enumerate(
                raw_values + (
                    (width - len(raw_values)) * [None]  # aligning values
                    if len(raw_values) < width else [])):
            if isinstance(raw_value, dict):
                raw_value = dict(raw_value)
                value = raw_value.pop('value', None)
                metadata[index] = raw_value
            else:
                value = raw_value

            # Fix this by doing this in charts class methods
            if issubclass(cls, Histogram):
                if value is None:
                    value = (None, None, None)
                elif not is_list_like(value):
                    value = (value, config.zero, config.zero)
                value = list(map(adapter, value))
            elif cls._dual:
                if value is None:
                    value = (None, None)
                elif not is_list_like(value):
                    value = (value, config.zero)
                if x_adapter:
                    value = (x_adapter(value[0]), adapter(value[1]))
                if issubclass(
                        cls, (Worldmap, FrenchMapDepartments)):
                    value = (adapter(value[0]), value[1])
                else:
                    value = list(map(adapter, value))
            else:
                value = adapter(value)

            values.append(value)
        serie_config = SerieConfig()
        serie_config(**config.to_dict())
        serie_config(**serie_config_kwargs)
        series.append(
            Serie(offset + len(series), title, values, serie_config, metadata))
    return series