from __future__ import division, print_function from six import StringIO from svgpath2mpl import parse_path from collections import defaultdict import xml.etree.ElementTree as etree import re import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import requests import pandas as pd import datetime def calling_pred_map_viz(): r = "snazzy-image-01.svg" tree = etree.parse(r) root = tree.getroot() path_elems = root.findall('.//{http://www.w3.org/2000/svg}path') paths = [parse_path(elem.attrib['d']) for elem in path_elems] facecolors = [] edgecolors = [] linewidths = [] for elem in path_elems: facecolors.append(dict(item.split(":") for item in elem.attrib.get('style', 'none').split(";")).get("fill", "none")) edgecolors.append(dict(item.split(":") for item in elem.attrib.get('style', 'none').split(";")).get("stroke", "none")) linewidths.append(dict(item.split(":") for item in elem.attrib.get('style', 'none').split(";")).get("stroke-width", "none").replace("px", "")) path_id = defaultdict(int) for i, elem in enumerate(path_elems): try: #print(i, elem.attrib['id']) path_id[elem.attrib['id']] = i except: continue counts_df1 = merge_volumes(counts_df) counts_df1.loc[:,'date_time'] = pd.to_datetime(counts_df1.loc[:,'date'] + " "+ counts_df1.loc[:,'time'], format='%Y-%m-%d %H:%M:%S') counts_df1.loc[:,'hour'] = counts_df1.loc[:,'date_time'].apply(hour_rounder) counts_df1.loc[:,'day_name'] = counts_df1.loc[:,'date_time'].dt.day_name() filtered_date = counts_df1.iloc[-1]['date'] filtered_time = counts_df.iloc[-1]['time'] filtered_day = counts_df1.iloc[-1]['day_name'] filtered_hour = counts_df1.iloc[-1]['hour'] day_hour_view_group = counts_df1.groupby(by=['view', 'day_name', 'hour'])['total'].mean().reset_index() count_max = day_hour_view_group['total'].max() count_min = day_hour_view_group['total'].min() count_dict = {"woodlands_to_sg" :date_view_group.loc[(date_view_group['view'] == 'Woodlands - to SG') & (date_view_group['day_name'] == filtered_day) & (date_view_group['hour'] == filtered_hour), "total" ].iloc[0], "woodlands_to_jh" :date_view_group.loc[(date_view_group['view'] == 'Woodlands - to Johor') & (date_view_group['day_name'] == filtered_day) & (date_view_group['hour'] == filtered_hour), "total" ].iloc[0], "tuas_to_sg" :date_view_group.loc[(date_view_group['view'] == 'Tuas - to SG') & (date_view_group['day_name'] == filtered_day) & (date_view_group['hour'] == filtered_hour), "total" ].iloc[0], "tuas_to_jh" :date_view_group.loc[(date_view_group['view'] == 'Tuas - to Johor') & (date_view_group['day_name'] == filtered_day) & (date_view_group['hour'] == filtered_hour), "total" ].iloc[0] } values = np.array([0., 0.5, 1.]) values = np.sort(np.array(values)) values = np.interp(values, (values.min(), values.max()), (0., 1.)) colors = ["#539f6b", "#ffc835", "#bf0000"] cmap = mpl.colors.LinearSegmentedColormap.from_list("custom", list(zip(values, colors))) norm = mpl.colors.Normalize(vmin=count_min, vmax=count_max) hex_dict = {k: mpl.colors.to_hex(cmap(norm(v))) for k, v in count_dict.items()} color_dict = defaultdict(str) for k, i in path_id.items(): #print(k, i) color_dict[i] = hex_dict[k] for k, i in color_dict.items(): #print(k,i) facecolors[k] = i collection = mpl.collections.PathCollection(paths, edgecolors=edgecolors, linewidths=[int(i)/100 for i in linewidths if i != 'none'], facecolors=[i.strip() for i in facecolors]) fig = plt.figure(figsize=(10,10)) ax = fig.add_subplot(111) # ax.close() collection.set_transform(ax.transData) ax.add_artist(collection) ax.set_xlim([100, 1900]) ax.set_ylim([1800, 0]) ax.text(200, 100, '1,000,000', color='r', size='large', name = 'Georgia') ax.set_title(datetime.datetime.strptime(last_date, '%Y-%m-%d').strftime('%a, %d %B %Y') + " | " + last_time + " SGT", fontname = 'Georgia') plt.show() calling_map_viz()