本项目适合做计算机相关专业的毕业设计,课程设计,技术难度适中、工作量比较充实。
完整资源获取
点击下载完整资源
1、资源项目源码均已通过严格测试验证,保证能够正常运行;
2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通;
3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;
4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
本项目主要是探讨恶劣天气的分布、空气质量的分布状况、温度、风速、降水方面,来对应相应的地区空气污染情况,实时反馈天气状况 并以散点图的形式来展现中国各大城市的空气质量情况
项目分工
-
负责提供数据和对数据故事具有表现力的地图等,包含三份数据,五份实现交互的图表,还提供了py文档、以及Flask+dash的交互功能实现的部分代码
-
通过掌握到的python知识,比如条件判断、推导式、循环遍历等,实现了dash可视化界面,并获取点击的城市分析该城市的数据,实现了具有交互功能的html页面,比如下拉框和数据表格交互,下拉框和条形图交互,编写了网页基本的css样式、html等
-
页面内分别有2个url
- 空气质量报告:该页面主要展示国内375个城市空气质量预报,包括api指数、首要污染物、空气质量
- 天气数据可视化:该页面可以呈现某城市的最高和最低温度、紫外线强度、相对湿度、能见度、风速随时间变化而变化和对应时间的空气质量情况
空气质量报告
- 首页地图、表格和点击城市交互图表数据、交互功能的部分代码由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)