From 0866ce20023e68a00d45f4786686711e95bc8491 Mon Sep 17 00:00:00 2001 From: Ashley Razo Date: Mon, 12 May 2025 11:26:23 +0200 Subject: [PATCH] Add chart1 and chart2 visualizations for UK data --- flaskapp/routes.py | 61 +++++++++++++++++++++++++++++++++ flaskapp/templates/chart1.html | 2 ++ flaskapp/templates/chart2.html | 2 ++ instance/site.db | Bin 2744320 -> 2744320 bytes 4 files changed, 65 insertions(+) create mode 100644 flaskapp/templates/chart1.html create mode 100644 flaskapp/templates/chart2.html diff --git a/flaskapp/routes.py b/flaskapp/routes.py index ac7f7f5f0..c7555dda2 100644 --- a/flaskapp/routes.py +++ b/flaskapp/routes.py @@ -1,8 +1,15 @@ from flask import render_template, flash, redirect, url_for, request from flaskapp import app, db from flaskapp.models import BlogPost, IpView, Day +from flaskapp.models import UkData from flaskapp.forms import PostForm import datetime +import matplotlib +matplotlib.use('Agg') #Use non-GUI backend +import matplotlib.pyplot as plt +import io +import base64 + import pandas as pd import json @@ -71,3 +78,57 @@ def before_request_func(): db.session.add(ip_view) # insert into the ip_view table db.session.commit() # commit all the changes to the database + +@app.route('/chart1') +def chart1(): + data = UkData.query.all() + df = pd.DataFrame([d.__dict__ for d in data]) + + df['region'] = df['region'].str.strip() + df = df[~df['region'].isin(['Wales', 'Scotland'])] + + if df.empty: + return "No English regions found in the data." + + #Example chart: Voter turnout per region + turnout_by_region = df.groupby('region')['Turnout19'].mean() + + fig, ax = plt.subplots() + turnout_by_region.plot(kind = 'bar', ax = ax) + ax.set_title("Average 2019 Turnout in English Regions") + ax.set_ylabel("Turnout (%)") + + fig.tight_layout() #fix axis cropping + + img = io.BytesIO() + fig.savefig(img, format = 'png') + img.seek(0) + plot_url = base64.b64encode(img.getvalue()).decode() + + return render_template('chart1.html', plot_url = plot_url) + +@app.route('/chart2') +@app.route('/chart2/') +def chart2(country = None): + data = UkData.query.all() + df = pd.DataFrame([d.__dict__ for d in data]) + + if country: + df = df[df['region'].str.lower() == country.lower()] + + party_votes = df[['ConVote19', 'LabVote19', 'LDVote19']].mean() + party_votes.index = ['Conservative', 'Labour', 'Liberal Democrats'] + + fig, ax = plt.subplots() + party_votes.plot(kind='pie', ax = ax, autopct = '%1.1f%%') + ax.set_title(f"Average Vote Share{' in ' + country.title() if country else ''}") + ax.set_ylabel('') + + fig.tight_layout() #fix axis cropping + + img = io.BytesIO() + fig.savefig(img, format = 'png') + img.seek(0) + plot_url = base64.b64encode(img.getvalue()).decode() + + return render_template('chart2.html', plot_url = plot_url) diff --git a/flaskapp/templates/chart1.html b/flaskapp/templates/chart1.html new file mode 100644 index 000000000..f4fba533d --- /dev/null +++ b/flaskapp/templates/chart1.html @@ -0,0 +1,2 @@ +

Chart 1: Average Turnout by Region

+ diff --git a/flaskapp/templates/chart2.html b/flaskapp/templates/chart2.html new file mode 100644 index 000000000..2860854dc --- /dev/null +++ b/flaskapp/templates/chart2.html @@ -0,0 +1,2 @@ +

Chart 2: Average Vote Share by Party

+ diff --git a/instance/site.db b/instance/site.db index 1f77ee42905fe947355f2d25a5da042a0e37e5d9..175b2048350049ca13bdc119318b77ae59259948 100644 GIT binary patch delta 506 zcmZwCy-UMT6b10a*Cc+_+_tu{+S(+3JGABnilc*57b(S|n+T$VLpnJ*6f9V9iDW4O zv0K+lp>gcuTnGOEK@dj~+&zL|jq>;n_rg2xy!xOc*1^q)rK{|YR1ylOm$!#)J)w{* z&>KC`0}ZH4ZE}NnIrSk0MmhB&^^Cy{GgO6{qHWp5yj9F|JE_W}Gmm=R%{>IQ1bU}u zdZc^mQ-@lipbpEaqxWp(*U05we|tBEoT@;tsB?!hO{!5flyl51O<}sp?X7}^!+)A- z^1plTHTTaDT=@zfqTDq#=!7bv-~;A0oVfY@OC=rAP4Vv|T=s^JcJ4bDz9YgIFo=Kz zGAJ+(6EF!=5QS+_fglEPNWcsvAq5)DLK@~^9x{-H1;~L82AHr2ORx+punKFi9{A42 GQSB4YGoR%E delta 339 zcmZ9^yGp}w07mh|zwvIrR!zOM+E}ky^bs7~rGvYRbd3+-P_SS|C4&$Vy1Awl632iz zIMu-i5Cjn?5!^kl8GhU0bn<(NDq$6M4_cmHV^74EJU{^3Qx{yy8q2ksqWM* zG&d$12Gxr=xQqiEBQO|+gE5R_0+X1+G-fc15`;1;n8Q34;G&8}EMXZdsG*Kktf2u9 U>u6#Fo7loOcCeepf!{v+0~!8=i~s-t