毕业设计——基于python+Flask+echarts构建的城市空气质量数据分析及可视化(源码+数据集)

本项目适合做计算机相关专业的毕业设计,课程设计,技术难度适中、工作量比较充实。

完整资源获取
点击下载完整资源

1、资源项目源码均已通过严格测试验证,保证能够正常运行;
2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通;
3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;
4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

本项目主要是探讨恶劣天气的分布、空气质量的分布状况、温度、风速、降水方面,来对应相应的地区空气污染情况,实时反馈天气状况 并以散点图的形式来展现中国各大城市的空气质量情况

项目分工
  • 负责提供数据和对数据故事具有表现力的地图等,包含三份数据,五份实现交互的图表,还提供了py文档、以及Flask+dash的交互功能实现的部分代码

  • 通过掌握到的python知识,比如条件判断、推导式、循环遍历等,实现了dash可视化界面,并获取点击的城市分析该城市的数据,实现了具有交互功能的html页面,比如下拉框和数据表格交互,下拉框和条形图交互,编写了网页基本的css样式、html等

  • 页面内分别有2个url

  1. 空气质量报告:该页面主要展示国内375个城市空气质量预报,包括api指数、首要污染物、空气质量
  2. 天气数据可视化:该页面可以呈现某城市的最高和最低温度、紫外线强度、相对湿度、能见度、风速随时间变化而变化和对应时间的空气质量情况

空气质量报告

  • 首页地图、表格和点击城市交互图表数据、交互功能的部分代码由17级苏衍中提供,呈现跳转界面和交互功能的实现由我和林立宇负责,通过点击所选的城市,实现跳转,清晰地展现饼状图显示近一周该城市的空气质量情况;散点图则根据空气质量数据来可视化的呈现近一周的空气状况是否良好;折现图则展现了当地城市的近期最高气温、最低气温和紫外线情况,充分地体现了近期的温差情况,由此看出近期某城市的天气状况
  • 其中选择城市后的选框的删除键,可以返回到首页的空气质量预报情况表,当浏览者希望重新选择城市可视化的看其天气预报情况,便可通过此实现,既方便也省时。
  • 首页点击跳转后,上面的四个按钮可以实现页面跳转交互,跳转到相对应的页面呈现不同的类型图表。

天气数据可视化

折现图则展现了当地城市的近期最高气温、最低气温和紫外线情况,充分地体现了近期的温差情况,并且可视化地呈现当天的昼夜温差情况,为浏览者提供当天的衣着多少为适合的便利,并且以框选时间的交互来实现当天实时的气温预计情况,在此页面还可实现对当天或近期某时的气温的总览;条形图下呈现以不同的颜色柱状来表示分类,其实可以看出相对湿度与能见度的相关性不大,风速、能见度和相对湿度基本上保持一个稳定值,直观地反映了该城市的天气状况;

  • 同时散点图(地图)的页面中也实现了移动到某地城市时,可以可视化的看到当地的 api指数、首要污染物、空气质量,以及近期的空气状况,动态地显示全国某城市的空气质量情况预报,为浏览者提供有效并可观的信息反馈和图表。

核心源码:

# -*- coding: utf-8 -*-

from flask import Flask,render_template,request
import dash
from dash.dependencies import Input, Output
import dash_core_components as dcc
import dash_html_components as html

import plotly.graph_objs as go

date = '2020-01-05'
city = '北京'
# 加载数据
import pandas as pd

df1 = pd.read_csv('air_forecast.csv')
d1 = df1[df1['城市']==city]

quality_level = ['优','良','轻度污染','中度污染','重度污染']
df2 = pd.read_csv('aqi_forecast.csv')
d2 = df2[df2['日期']==date]
quality_count = [d2[d2['空气质量']==level].shape[0] for level in quality_level]

df3 = pd.read_csv('china-city-list.csv',usecols=['Admin_ district_CN','Latitude','Longitude'])

df3.drop_duplicates(subset=['Admin_ district_CN'],keep='first',inplace=True)
df3.reset_index(drop=True,inplace=True)

texts = []
for i in range(df3.shape[0]):
    ct = df3.at[i,'Admin_ district_CN']
    text = ct+'<br>'
    text += '日期\taqi指数\t首要污染物\t空气质量<br>'
    data = df2[df2['城市']==ct]
    dt = data['日期'].tolist()
    aqi =  data['aqi指数'].tolist()
    main = data['首要污染物'].tolist()
    quality = data['空气质量'].tolist()
    for d,a,m,q in zip(dt,aqi,main,quality):
        text += d+'\t'+str(a)+'\t'+m+'\t'+q+'<br>'
    texts.append(text)
df3['text'] = texts

server = Flask(__name__)

app = dash.Dash(__name__, server=server, url_base_pathname='/dash/')

colors = dict(background = '#ffffff', text = '#7FDBFF')

app.layout = html.Div([
    html.H1(
        children='天气数据可视化',
        style=dict(textAlign='center', color=colors['text'])),
    dcc.Dropdown(
        id='my_dropdown',
        placeholder='请选择图表',
        options=[{'label': '折线图', 'value': '1'},
                 {'label': '条形图', 'value': '2'},
                 {'label': '饼状图', 'value': '3'},
                 {'label': '散点图', 'value': '4'}],
        value='1'),
    dcc.Graph(id='my-graph')
])


@app.callback(
    Output(component_id='my-graph', component_property='figure'),
    [Input(component_id='my_dropdown', component_property='value')]
)
def update_graph(select_index):


    if select_index == '1':
        figure = {
            'data': [
                go.Scatter(
                    x=d1['日期'].tolist(),
                    y=d1[yi].tolist(),
                    mode='lines',
                    name=city+yi
                               ) for yi in ['最高温度','最低温度','紫外线强度指数']
            ],

            'layout': [
                go.Layout(
                    height=350,
                    hovermode='closest',
                    title='折线图'
                )
            ]
        }
        return figure
    elif select_index == '2':
        figure = {
            'data': [
                go.Bar(
                    x=d1['日期'].tolist(),
                    y=d1[yi].tolist(),
                    name=city+yi
                ) for yi in ['相对湿度','能见度(公里)','风速(公里/小时)']],

            'layout': [
                go.Layout(
                    height=350,
                    hovermode='closest',
                    title='条形图',
                )
            ]
        }
        return figure

    elif select_index=='3':
        figure = {
            'data': [
                go.Pie(
                    labels=quality_level,
                    values=quality_count,
                    name='legend'
                )],

            'layout': [
                go.Layout(
                    height=350,
                    hovermode='closest',
                    title='饼状图'
                )
            ]
        }
        return figure

    elif select_index=='4':
        figure = {
            'data': [
                go.Scatter(
                    x=df3['Longitude'].tolist(),
                    y=df3['Latitude'].tolist(),
                    text = df3['text'].tolist(),
                    mode='markers',
                    marker={'size': 15},
                    name='legend'
                )],

            'layout': [
                go.Layout(
                    height=350,
                    hovermode='closest',
                    title ='散点图'
                )
            ]
        }
        return figure

citys = []
for name,aqi,main,quality in zip(d2['城市'].tolist(),d2['aqi指数'].tolist(),d2['首要污染物'].tolist(),d2['空气质量'].tolist()):
    citys.append({
        'name':name,
        'aqi':aqi,
        'main':main,
        'quality': quality
    })

@server.route('/')
def index():
    return render_template('index.html',date=date,citys=citys)

@server.route('/process',methods=['POST'])
def process():
    global d1,city
    city = request.form['city']
    print(city)
    d1 = df1[df1['城市']==city]
    return 'ssss'

if __name__ == '__main__':
    server.run(debug=True,port=8051)

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
28「源码」数据可视化:基于 echarts flask 动态实时大屏 - 数据分析,是一种数据可视化的展示方式,通过将数据转换为图形化的形式,使数据更加直观、易于理解和分析。 该方案采用 echartsflask 这两种技术进行数据可视化的展示。Echarts 是一个基于 JavaScript 的开源可视化库,它提供了丰富的图表类型和交互式的功能,可以满足各种的数据可视化需求。FlaskPython 语言中的一个轻量级 Web 框架,它提供了构建 Web 应用的基础框架,同时也可以与其他库和插件进行组合使用,实现更加复杂的功能。 在该方案中,数据从后端数据库中获取,并通过 flask 的模板语言进行处理,然后通过 echarts 绘制出各种类型的图表。整个展示过程通过 WebSocket 技术实现动态更新,大屏幕的内容会实时更新,保障时效性和准确性。同时,在页面设计上也注重视觉效果和用户体验,数据展示界面简洁明了,显示效果清晰美观。 该方案可以被广泛应用于各种需要进行数据可视化展示的领域,例如企业经营数据分析、科学研究领域的数据可视化、金融、航空、物流等领域的数据分析等。由于使用的技术基础较为简单,对于开发人员来说,也具有较高的可拓展性和可维护性。因此,它是一种非常实用的数据可视化方案,可以为用户提供更好的数据分析和决策支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白话机器学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值