网络爬虫系列2:数据利用pyecharts进行展示

本文通过爬取潍坊历史天气数据并使用Pandas进行处理,利用Pyecharts进行天气状况及温度变化的可视化展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过获取城市天气数据,利用pyecharts进行展示。

import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Line, Bar, Grid
from pyecharts.charts import  Page

import datetime
now=datetime.datetime.now().strftime('%Y-%m-%d')

df=pd.read_html('http://www.tianqihoubao.com/weather/top/weifang.html',encoding='gbk',header=0)[0]  #[0]为选择第1张table,
df=df.iloc[1:,:]  #数据从第2行开始,因为表头有两行
df_rename=df.rename(columns={"白天": "白天天气状况","白天.1": "白天风力方向", "白天.2": "白天最高温度",
                             "夜间": "夜间天气状况", "夜间.1": "夜间风力方向", "夜间.2": "夜间最低温度"})
#print(df_rename)
df_rename['日期']=df_rename['日期'].str[0:10]
df_rename['白天—最高温度']=df_rename['白天最高温度'].str[:-1].astype(int) #新增‘白天—最高温度’列,并删除‘℃’取int类型数据
df_rename['黑夜—最低温度']=df_rename['夜间最低温度'].str[:-1].astype(int) #新增‘黑夜—最低温度’列,并删除‘℃’取int类型数据
#print(df_rename)
data0= df_rename.sort_values(by='日期')  #先对数据按日期排序
# 保存到Excel
data0.to_excel(r'weifang_weather' + now + '.xlsx', index=0)

#print(data0) #测试数据情况
cate = data0['日期'].tolist()   #用于将二维变为列表,用于pyecharts展示
data1 = data0['白天—最高温度'].tolist()
data2 = data0['黑夜—最低温度'].tolist()
#print(cate) #测试数据情况
#print(data1)
# print(df_rename['黑夜—最低温度'].describe())
#print(df_rename.describe()) #测试数据情况

page=Page() #运用page实现多个图例绘制在一张图
c1 = (
      Bar()
      .add_xaxis(df_rename.groupby(['白天天气状况'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['白天天气状况'].tolist())
      .add_yaxis("天数",df_rename.groupby(['白天天气状况'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['日期'].tolist())
      .reversal_axis()
      .set_series_opts(label_opts=opts.LabelOpts(position="right"))
      .set_global_opts(title_opts=opts.TitleOpts(title="白天天气状况"),
                        #legend_opts=opts.LegendOpts(pos_right='30%',pos_top='55%')
                       )
    #.render(r'.\Weifang_weather1.html')
     )
c2 = (
      Bar()
      .add_xaxis(df_rename.groupby(['夜间天气状况'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['夜间天气状况'].tolist())
      .add_yaxis("天数", df_rename.groupby(['夜间天气状况'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['日期'].tolist())
      .reversal_axis()
      .set_series_opts(label_opts=opts.LabelOpts(position="right"))
      .set_global_opts(title_opts=opts.TitleOpts(title="夜间天气状况",pos_left="60%"),
                        #legend_opts=opts.LegendOpts(pos_left='30%',pos_top='55%')
                       )
    #.render(r'.\Weifang_weather2.html')
     )

c3 = (
      Bar()
      .add_xaxis(df_rename.groupby(['白天风力方向'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['白天风力方向'].tolist())
      .add_yaxis("天数", df_rename.groupby(['白天风力方向'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['日期'].tolist())
      .reversal_axis()
      .set_series_opts(label_opts=opts.LabelOpts(position="right"))
      .set_global_opts(title_opts=opts.TitleOpts(title="白天风力方向",pos_top='25%'),
                       #legend_opts=opts.LegendOpts(pos_left='30%',pos_bottom='55%')
                       )
    #.render(r'.\Weifang_weather3.html')
     )
c4 = (
      Bar()
      .add_xaxis(df_rename.groupby(['夜间风力方向'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['夜间风力方向'].tolist())
      .add_yaxis("天数", df_rename.groupby(['夜间风力方向'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['日期'].tolist())
      .reversal_axis()
      .set_series_opts(label_opts=opts.LabelOpts(position="right"))
      .set_global_opts(title_opts=opts.TitleOpts(title="夜间风力方向",pos_left="60%",pos_top='25%'),
                        #legend_opts=opts.LegendOpts(pos_left='30%',pos_bottom='55%')
                       )
    #.render(r'.\Weifang_weather4.html')
     )
#一页显示多张图:一种方法是page添加图例

page.add(c1,c2,c3,c4)
page.render(r'.\Weifang_weather1234_page.html')

#一页显示多张图:另一种方法是用Grid添加图例
c5 = (
        Line(init_opts=opts.InitOpts(width='1000px,height=500px'))
        .add_xaxis(cate)
        .add_yaxis('白天', data1,is_smooth=True,
         #          markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]) #可在后面set_series_opts中统一设置
                   )
        .add_yaxis('黑夜', data2,is_smooth=True,
        #可以自定义数据标签
        #markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(name="自定义标记点", coord=[cate[8], data2[8]], value=data2[2])])
                   )
        # 设置全局配置
        .set_global_opts(title_opts=opts.TitleOpts(title="潍坊市气温折线图",
                                                  subtitle="取白天最高气温与黑夜最低气温",pos_top='0%'),#title在图表中的位置
                        tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), #加十字提示光标
                        toolbox_opts = opts.ToolboxOpts(is_show = True), #加工具箱
                        datazoom_opts=opts.DataZoomOpts(range_start=70,range_end=100), #加水平滚动轴,开始于70%至最后
                         xaxis_opts=opts.AxisOpts(name='日期'),
                         yaxis_opts=opts.AxisOpts(name='气温')

                        )
       # 设置系列配置
        .set_series_opts(
               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="平均值")]),
                   )
       #.render(r'.\Weifang_weather5_line' + now + '.html')
       #.render_notebook()  #使用Jupyter时用该语句
       )

grid=(
    Grid()
    .add(c1, grid_opts=opts.GridOpts(pos_right="60%",pos_bottom='80%'))
    .add(c2, grid_opts=opts.GridOpts(pos_left="60%",pos_bottom='80%'))
    .add(c3, grid_opts=opts.GridOpts(pos_right="60%",pos_top='30%',pos_bottom='55%'))
    .add(c4, grid_opts=opts.GridOpts(pos_left="60%",pos_top='30%',pos_bottom='55%'))
    .add(c5, grid_opts=opts.GridOpts(pos_top='65%'))
    .render(r'.\Weifang_weather_grid' + now + '.html')
)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值