예제 #1
0
def prepare_values(raw, config, cls):
    """Prepare the values to start with sane values"""
    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]
    adapter = reduce(compose, adapters) if not config.strict else ident
    series = []
    width = max([len(values)
                 for _, values in raw] + [len(config.x_labels or [])])

    for title, raw_values in raw:
        metadata = {}
        values = []
        if isinstance(raw_values, dict):
            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
        else:
            raw_values = list(raw_values)

        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):
                value = raw_value.pop('value')
                metadata[index] = raw_value
            else:
                value = raw_value

            if cls.__name__ == 'XY' or cls.__name__ == 'DateY':
                if value is None:
                    value = (None, None)
                elif not hasattr(value, '__iter__'):
                    value = (value, config.zero)
                value = map(adapter, value)
            else:
                value = adapter(value)

            values.append(value)
        series.append(Serie(title, values, metadata))
    return series
예제 #2
0
파일: base.py 프로젝트: yzhen-hit/pygal
    def prepare_values(self, raw, offset=0):
        """Prepare the values to start with sane values"""
        from pygal import Histogram
        from pygal.graph.map import BaseMap

        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
예제 #3
0
파일: util.py 프로젝트: sethkontny/pygal
def prepare_values(raw, config, cls):
    """Prepare the values to start with sane values"""
    from pygal.graph.datey 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 = 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]
    adapter = reduce(compose, adapters) if not config.strict else ident
    series = []

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

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

    for title, raw_values 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 issubclass(cls, DateY) or issubclass(
                        cls, (Worldmap, FrenchMapDepartments)):
                    value = (adapter(value[0]), value[1])
                else:
                    value = list(map(adapter, value))
            else:
                value = adapter(value)
            values.append(value)
        series.append(Serie(title, values, metadata))
    return series