青岛崂山区过去24小时气候变化可视化

前面已经介绍过几个方便的可视化工具了!今天又发现了一个python里面非常便捷的Echarts的改版(为python而生的)!抽时间学了一下,随手做了一个简单的小项目!
项目逻辑比较简单,简单介绍一下过程以及工具的使用!(以后pytho n处理完数据之后,就可以直接使用了)

项目简介

大体过程是:用python语言对中国气象台的网站进行气象数据的爬取,然后将爬取下来的数据使用pyecharts进行可视化分析。
声明:数据的爬取,仅用于本次练习,非商业用途

数据获取

之前的文章有讲解过使用java的webMagic进行数据的爬取!但是当前使用爬虫最火的还要数python!等有时间在出一篇关于python 爬虫的记录!
中央气象台
首先,打开中央气象台的网站,然后在城市预报中随便选择一个热门城市!然后打开we b控制台,手动切换省份以及城市的名称对页面进行分析。
在python中web的学习可以参考requests库,当然还有urllib urllib2等库。大佬说建议全面放弃!我就不介绍这两个了!版本也有点老了

1
2
3
4
5
#获得请求数据的函数 
def get_html(url):
#请求的连接
r=requests.get(url)
return r.text

通过分析可以找到 URL1 = ‘http://www.nmc.cn/f/rest/province/ASD'
这个连接是代表的省份 其中ASD表示的是山东省的代码
URL = ‘http://www.nmc.cn/f/rest/passed/55538‘这个链接是某一个城市过去24小时的气候信息,其中的55538是某一个城市的代号。这里使用的是json格式的。

1
2
3
在这个网站中 城市与代号之间的对应关系 是 
省会 - 城市 - 代号
所以我们要先获得城市的代码,然后找到要使用的城市的名称 然后获得代号

这样我们通过上述代码就可以获得每一部分的数据!通过查看单个链接数据可以发现数据格式是json数据格式,因此我们需要对数据进行一个简单的解析。

我们首先解析一个城市到城市代码的 映射

1
2
3
4
5
6
7
def get_citymap(url):
obj = get_html(url)
parse_json = json.loads(obj)
code_citymap = {}
for a in parse_json:
code_citymap[a['city']] = a['code']
return code_citymap

然后根据城市映射,构建一个新的请求链接。直接获得要请求的数据

1
2
3
4
def geturl(cityname,url):
URL = 'http://www.nmc.cn/f/rest/passed/'
code = get_citymap(url)[cityname]
return URL+code

对请求的数据进行json解析

1
2
obb = get_html(geturl('崂山',URL1))
parse_dajson = json.loads(obb)

根据解析出来的数据,将我们要关注的天气信息进行统计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
time = []
rain = []
temperature = []
humidity = []
pressure = []
windSpeed = []
for a in parse_dajson:
time.append(a['time'])
if a['rain1h']==9999.0 and len(rain)!=0:
a['rain1h']= rain[-1]
rain.append(a['rain1h'])
if a['temperature']==9999.0 and len(temperature)!=0:
a['temperature']=temperature[-1]
temperature.append(a['temperature'])
if a['humidity']==9999.0 and len(humidity)!=0:
a['humidity']=humidity[-1]
humidity.append(a['humidity'])
if a['pressure']==9999.0 and len(pressure)!=0:
a['pressure']=pressure[-1]
pressure.append(a['pressure'])
if a['windSpeed']==9999.0 and len(windSpeed)!=0:
a['windSpeed']=windSpeed[-1]
windSpeed.append(a['windSpeed'])

统计完信息之后,我们就要进行可视化处理了!就要用到python版本的p yecharts。对于pyecharts在网络上主要有两个版本。我们尽量使用最新版!这个也是让我对python感到非常头疼的。版本更新,语法不兼容!
对于pyecharts的学习建议大家直接学习官方学习文档
官方为大家提供了足够的使用模板可修改性是比较强的。
下面就是使用官方文档进行的一个可视化过程。
使用之前需要导入所需要的包

1
2
3
import pyecharts.options as opts
from pyecharts.charts import Line,Bar,Page,PictorialBar
from pyecharts.globals import ThemeType,SymbolType

为了将所有的可视化结果全部显示在一个网页上,我们需要设置一下

1
2
3
4
5
6
page = Page(layout=Page.DraggablePageLayout)
...
这部分是a,b,c,d模块
...
page.add(a,b,c,d)
page.render("/Users/gorge/Desktop/temperature_change_line_chart.html")

对于a ,bcc,d模块的写法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
## 气温
a=(
Line(init_opts=opts.InitOpts(width="1600px", height="400px"))
.add_xaxis(xaxis_data=time)
.add_yaxis(
series_name="气温",
y_axis=temperature,
markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值"),
]
),
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(type_="average", name="平均值")]
),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="青岛过去24小时气温变化", subtitle="数据真实"),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
toolbox_opts=opts.ToolboxOpts(is_show=True),
xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),
)

)

b= (
Bar({"theme": ThemeType.MACARONS})
.add_xaxis(time)
.add_yaxis("temperature", temperature)
.add_yaxis("humidity", humidity)
)

c = (
PictorialBar()
.add_xaxis(time)
.add_yaxis(
"",
windSpeed,
label_opts=opts.LabelOpts(is_show=False),
symbol_size=18,
symbol_repeat="fixed",
symbol_offset=[0, 0],
is_symbol_clip=True,
symbol=SymbolType.ROUND_RECT,
)
.reversal_axis()
.set_global_opts(
title_opts=opts.TitleOpts(title="青岛过去24小时风速图"),
xaxis_opts=opts.AxisOpts(is_show=False),
yaxis_opts=opts.AxisOpts(
axistick_opts=opts.AxisTickOpts(is_show=False),
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(opacity=0)
),
),
)
)

d = (
Line()
.add_xaxis(time)
.add_yaxis("降雨量/mm", rain, is_smooth=True)
.set_global_opts(title_opts=opts.TitleOpts(title="青岛过去24小时降水图"))
)

通过上述操作,我们就可以获得一个可以动态显示的网页版的可视化界面了!这样看起来是不是要比Echarts的好多了呀!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述