mirror of https://github.com/Kozea/pygal.git
Florian Mounier
10 years ago
11 changed files with 77 additions and 818 deletions
@ -1,325 +0,0 @@
|
||||
# -*- coding: utf-8 -*- |
||||
# This file is part of pygal |
||||
# |
||||
# A python svg graph plotting library |
||||
# Copyright © 2012-2014 Kozea |
||||
# |
||||
# This library is free software: you can redistribute it and/or modify it under |
||||
# the terms of the GNU Lesser General Public License as published by the Free |
||||
# Software Foundation, either version 3 of the License, or (at your option) any |
||||
# later version. |
||||
# |
||||
# This library is distributed in the hope that it will be useful, but WITHOUT |
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
||||
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more |
||||
# details. |
||||
# |
||||
# You should have received a copy of the GNU Lesser General Public License |
||||
# along with pygal. If not, see <http://www.gnu.org/licenses/>. |
||||
""" |
||||
Worldmap chart |
||||
|
||||
""" |
||||
|
||||
from __future__ import division |
||||
from collections import defaultdict |
||||
from pygal.graph.map import BaseMap |
||||
from pygal._compat import u |
||||
from numbers import Number |
||||
|
||||
import os |
||||
|
||||
|
||||
DEPARTMENTS = { |
||||
'01': u("Ain"), |
||||
'02': u("Aisne"), |
||||
'03': u("Allier"), |
||||
'04': u("Alpes-de-Haute-Provence"), |
||||
'05': u("Hautes-Alpes"), |
||||
'06': u("Alpes-Maritimes"), |
||||
'07': u("Ardèche"), |
||||
'08': u("Ardennes"), |
||||
'09': u("Ariège"), |
||||
'10': u("Aube"), |
||||
'11': u("Aude"), |
||||
'12': u("Aveyron"), |
||||
'13': u("Bouches-du-Rhône"), |
||||
'14': u("Calvados"), |
||||
'15': u("Cantal"), |
||||
'16': u("Charente"), |
||||
'17': u("Charente-Maritime"), |
||||
'18': u("Cher"), |
||||
'19': u("Corrèze"), |
||||
'2A': u("Corse-du-Sud"), |
||||
'2B': u("Haute-Corse"), |
||||
'21': u("Côte-d'Or"), |
||||
'22': u("Côtes-d'Armor"), |
||||
'23': u("Creuse"), |
||||
'24': u("Dordogne"), |
||||
'25': u("Doubs"), |
||||
'26': u("Drôme"), |
||||
'27': u("Eure"), |
||||
'28': u("Eure-et-Loir"), |
||||
'29': u("Finistère"), |
||||
'30': u("Gard"), |
||||
'31': u("Haute-Garonne"), |
||||
'32': u("Gers"), |
||||
'33': u("Gironde"), |
||||
'34': u("Hérault"), |
||||
'35': u("Ille-et-Vilaine"), |
||||
'36': u("Indre"), |
||||
'37': u("Indre-et-Loire"), |
||||
'38': u("Isère"), |
||||
'39': u("Jura"), |
||||
'40': u("Landes"), |
||||
'41': u("Loir-et-Cher"), |
||||
'42': u("Loire"), |
||||
'43': u("Haute-Loire"), |
||||
'44': u("Loire-Atlantique"), |
||||
'45': u("Loiret"), |
||||
'46': u("Lot"), |
||||
'47': u("Lot-et-Garonne"), |
||||
'48': u("Lozère"), |
||||
'49': u("Maine-et-Loire"), |
||||
'50': u("Manche"), |
||||
'51': u("Marne"), |
||||
'52': u("Haute-Marne"), |
||||
'53': u("Mayenne"), |
||||
'54': u("Meurthe-et-Moselle"), |
||||
'55': u("Meuse"), |
||||
'56': u("Morbihan"), |
||||
'57': u("Moselle"), |
||||
'58': u("Nièvre"), |
||||
'59': u("Nord"), |
||||
'60': u("Oise"), |
||||
'61': u("Orne"), |
||||
'62': u("Pas-de-Calais"), |
||||
'63': u("Puy-de-Dôme"), |
||||
'64': u("Pyrénées-Atlantiques"), |
||||
'65': u("Hautes-Pyrénées"), |
||||
'66': u("Pyrénées-Orientales"), |
||||
'67': u("Bas-Rhin"), |
||||
'68': u("Haut-Rhin"), |
||||
'69': u("Rhône"), |
||||
'70': u("Haute-Saône"), |
||||
'71': u("Saône-et-Loire"), |
||||
'72': u("Sarthe"), |
||||
'73': u("Savoie"), |
||||
'74': u("Haute-Savoie"), |
||||
'75': u("Paris"), |
||||
'76': u("Seine-Maritime"), |
||||
'77': u("Seine-et-Marne"), |
||||
'78': u("Yvelines"), |
||||
'79': u("Deux-Sèvres"), |
||||
'80': u("Somme"), |
||||
'81': u("Tarn"), |
||||
'82': u("Tarn-et-Garonne"), |
||||
'83': u("Var"), |
||||
'84': u("Vaucluse"), |
||||
'85': u("Vendée"), |
||||
'86': u("Vienne"), |
||||
'87': u("Haute-Vienne"), |
||||
'88': u("Vosges"), |
||||
'89': u("Yonne"), |
||||
'90': u("Territoire de Belfort"), |
||||
'91': u("Essonne"), |
||||
'92': u("Hauts-de-Seine"), |
||||
'93': u("Seine-Saint-Denis"), |
||||
'94': u("Val-de-Marne"), |
||||
'95': u("Val-d'Oise"), |
||||
'971': u("Guadeloupe"), |
||||
'972': u("Martinique"), |
||||
'973': u("Guyane"), |
||||
'974': u("Réunion"), |
||||
# Not a area anymore but in case of... |
||||
'975': u("Saint Pierre et Miquelon"), |
||||
'976': u("Mayotte") |
||||
} |
||||
|
||||
|
||||
REGIONS = { |
||||
'11': u("Île-de-France"), |
||||
'21': u("Champagne-Ardenne"), |
||||
'22': u("Picardie"), |
||||
'23': u("Haute-Normandie"), |
||||
'24': u("Centre"), |
||||
'25': u("Basse-Normandie"), |
||||
'26': u("Bourgogne"), |
||||
'31': u("Nord-Pas-de-Calais"), |
||||
'41': u("Lorraine"), |
||||
'42': u("Alsace"), |
||||
'43': u("Franche-Comté"), |
||||
'52': u("Pays-de-la-Loire"), |
||||
'53': u("Bretagne"), |
||||
'54': u("Poitou-Charentes"), |
||||
'72': u("Aquitaine"), |
||||
'73': u("Midi-Pyrénées"), |
||||
'74': u("Limousin"), |
||||
'82': u("Rhône-Alpes"), |
||||
'83': u("Auvergne"), |
||||
'91': u("Languedoc-Roussillon"), |
||||
'93': u("Provence-Alpes-Côte d'Azur"), |
||||
'94': u("Corse"), |
||||
'01': u("Guadeloupe"), |
||||
'02': u("Martinique"), |
||||
'03': u("Guyane"), |
||||
'04': u("Réunion"), |
||||
# Not a region anymore but in case of... |
||||
'05': u("Saint Pierre et Miquelon"), |
||||
'06': u("Mayotte") |
||||
} |
||||
|
||||
|
||||
with open(os.path.join( |
||||
os.path.dirname(__file__), 'maps', |
||||
'fr.departments.svg')) as file: |
||||
DPT_MAP = file.read() |
||||
|
||||
|
||||
class IntCodeMixin(object): |
||||
def adapt_code(self, area_code): |
||||
if isinstance(area_code, Number): |
||||
if area_code > 100: |
||||
return '%3d' % area_code |
||||
|
||||
return '%2d' % area_code |
||||
return super(IntCodeMixin, self).adapt_code(area_code) |
||||
|
||||
|
||||
class FrenchMapDepartments(IntCodeMixin, BaseMap): |
||||
"""French department map""" |
||||
x_labels = list(DEPARTMENTS.keys()) |
||||
area_names = DEPARTMENTS |
||||
area_prefix = 'z' |
||||
kind = 'departement' |
||||
svg_map = DPT_MAP |
||||
|
||||
|
||||
with open(os.path.join( |
||||
os.path.dirname(__file__), 'maps', |
||||
'fr.regions.svg')) as file: |
||||
REG_MAP = file.read() |
||||
|
||||
|
||||
class FrenchMapRegions(IntCodeMixin, BaseMap): |
||||
"""French regions map""" |
||||
x_labels = list(REGIONS.keys()) |
||||
area_names = REGIONS |
||||
area_prefix = 'a' |
||||
svg_map = REG_MAP |
||||
kind = 'region' |
||||
|
||||
|
||||
DEPARTMENTS_REGIONS = { |
||||
"01": "82", |
||||
"02": "22", |
||||
"03": "83", |
||||
"04": "93", |
||||
"05": "93", |
||||
"06": "93", |
||||
"07": "82", |
||||
"08": "21", |
||||
"09": "73", |
||||
"10": "21", |
||||
"11": "91", |
||||
"12": "73", |
||||
"13": "93", |
||||
"14": "25", |
||||
"15": "83", |
||||
"16": "54", |
||||
"17": "54", |
||||
"18": "24", |
||||
"19": "74", |
||||
"21": "26", |
||||
"22": "53", |
||||
"23": "74", |
||||
"24": "72", |
||||
"25": "43", |
||||
"26": "82", |
||||
"27": "23", |
||||
"28": "24", |
||||
"29": "53", |
||||
"2A": "94", |
||||
"2B": "94", |
||||
"30": "91", |
||||
"31": "73", |
||||
"32": "73", |
||||
"33": "72", |
||||
"34": "91", |
||||
"35": "53", |
||||
"36": "24", |
||||
"37": "24", |
||||
"38": "82", |
||||
"39": "43", |
||||
"40": "72", |
||||
"41": "24", |
||||
"42": "82", |
||||
"43": "83", |
||||
"44": "52", |
||||
"45": "24", |
||||
"46": "73", |
||||
"47": "72", |
||||
"48": "91", |
||||
"49": "52", |
||||
"50": "25", |
||||
"51": "21", |
||||
"52": "21", |
||||
"53": "52", |
||||
"54": "41", |
||||
"55": "41", |
||||
"56": "53", |
||||
"57": "41", |
||||
"58": "26", |
||||
"59": "31", |
||||
"60": "22", |
||||
"61": "25", |
||||
"62": "31", |
||||
"63": "83", |
||||
"64": "72", |
||||
"65": "73", |
||||
"66": "91", |
||||
"67": "42", |
||||
"68": "42", |
||||
"69": "82", |
||||
"70": "43", |
||||
"71": "26", |
||||
"72": "52", |
||||
"73": "82", |
||||
"74": "82", |
||||
"75": "11", |
||||
"76": "23", |
||||
"77": "11", |
||||
"78": "11", |
||||
"79": "54", |
||||
"80": "22", |
||||
"81": "73", |
||||
"82": "73", |
||||
"83": "93", |
||||
"84": "93", |
||||
"85": "52", |
||||
"86": "54", |
||||
"87": "74", |
||||
"88": "41", |
||||
"89": "26", |
||||
"90": "43", |
||||
"91": "11", |
||||
"92": "11", |
||||
"93": "11", |
||||
"94": "11", |
||||
"95": "11", |
||||
"971": "01", |
||||
"972": "02", |
||||
"973": "03", |
||||
"974": "04", |
||||
"975": "05", |
||||
"976": "06" |
||||
} |
||||
|
||||
|
||||
def aggregate_regions(values): |
||||
if isinstance(values, dict): |
||||
values = values.items() |
||||
regions = defaultdict(int) |
||||
for department, value in values: |
||||
regions[DEPARTMENTS_REGIONS[department]] += value |
||||
return list(regions.items()) |
Before Width: | Height: | Size: 583 KiB |
Before Width: | Height: | Size: 370 KiB |
@ -1,42 +0,0 @@
|
||||
# -*- coding: utf-8 -*- |
||||
# This file is part of pygal |
||||
# |
||||
# A python svg graph plotting library |
||||
# Copyright © 2012-2014 Kozea |
||||
# |
||||
# This library is free software: you can redistribute it and/or modify it under |
||||
# the terms of the GNU Lesser General Public License as published by the Free |
||||
# Software Foundation, either version 3 of the License, or (at your option) any |
||||
# later version. |
||||
# |
||||
# This library is distributed in the hope that it will be useful, but WITHOUT |
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
||||
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more |
||||
# details. |
||||
# |
||||
# You should have received a copy of the GNU Lesser General Public License |
||||
# along with pygal. If not, see <http://www.gnu.org/licenses/>. |
||||
|
||||
from pygal import ( |
||||
FrenchMapRegions, FrenchMapDepartments) |
||||
from pygal.graph.frenchmap import REGIONS, DEPARTMENTS, aggregate_regions |
||||
|
||||
|
||||
def test_frenchmaps(): |
||||
datas = {} |
||||
for dept in DEPARTMENTS.keys(): |
||||
datas[dept] = int(''.join([x for x in dept if x.isdigit()])) * 10 |
||||
|
||||
fmap = FrenchMapDepartments() |
||||
fmap.add('departements', datas) |
||||
q = fmap.render_pyquery() |
||||
assert len( |
||||
q('#departements .departement,#dom-com .departement') |
||||
) == len(DEPARTMENTS) |
||||
|
||||
fmap = FrenchMapRegions() |
||||
fmap.add('regions', aggregate_regions(datas)) |
||||
q = fmap.render_pyquery() |
||||
assert len(q('#regions .region,#dom-com .region')) == len(REGIONS) |
||||
|
||||
assert aggregate_regions(datas.items()) == aggregate_regions(datas) |
Loading…
Reference in new issue