Python数据可视化实践

目标:开发三份可视化图表:折线图、地图、动态柱状图

数据来源:

  • 本案例数据全部来自《百度疫情实时大数据报告》及公开的全球各国的GDP数据

使用的技术:

Echarts--百度开源的数据可视化。Python适合用于数据处理。 pyecharts

前置知识准备:

json数据格式

  • json是一种轻量级的数据交互模式。可以按照json指定的格式去组织和封装数据

  • json本质上是一个带有特定格式的字符串

主要功能:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中数据传递和交互,类似于:

  · 国际通用语言--英语

  · 中国56个民族不同地区之间的通用语言--普通话

json能够让不同的语言能够相互通用互相传递数据,json就是一种非常良好的中转数据格式。以Python和C语言为例:

json格式可以看作Python中的字典/内嵌字典的列表

  · Python数据和json数据的相互转化

"""

演示json数据和Python字典的相互转换

"""

import json

# 准备列表,内嵌元素为字典,将其转换为json

data = [{"name":'朱翠花1号',"age":21}, {"name":'朱翠花2号',"age":22}, {"name":'朱翠花3号',"age":23}]

json_str = json.dumps(data,ensure_ascii=False)

print(json_str,type(json_str))

# 准备字典,将字典转换为json

d = {"name":'朱翠花大坏蛋',"gender":'男'}

json_d = json.dumps(d,ensure_ascii=False)

print(json_d,type(json_d))

# 将json字符串转换为Python数据类型[{k:v,k:v},{k:v,k:v}]

s = '[{"name":"朱翠花1号","age":21}, {"name":"朱翠花2号","age":22}, {"name":"朱翠花3号","age":23}]'

list_j = json.loads(s)

print(type(list_j))

print(list_j)

# 将json字符串转换为Python数据类型{k:v,k:v}

str = '{"name":"朱翠花大坏蛋","gender":"男"}'

dj = json.loads(str)

print(type(dj))

print(dj)

pyecharts模块 --开发可视化图表的技术栈

如果想要做出数据可视化效果图,可以借助pyecharts模块完成。

Echarts是一个有百度开源的数据可视化,有着良好的交互性,精巧的图表设计。

pyecharts - A Python Echarts Plotting Library built with love.

pyecharts模块-入门操作

 1、基础折线图

2、pyecharts的配置选项

  • 全局配置选项:针对整个图像进行设置,图像标题、图例、工具箱等

       set_global_opts方法来进行配置:

     set_global_opts方法配置选项:

  • 系列配置选项:针对具体的轴数据进行配置 

"""

演示pyecharts入门

"""

# 导包

from pyecharts.charts import Line

from pyecharts.options import TitleOpts,LegendOpts,ToolboxOpts,VisualMapOpts

# 创建一个折线图对象

line = Line()

# 给折线图对象添加X轴数据

line.add_xaxis(["中国","美国","英国"])

# 给折线图对象添加Y轴数据

line.add_yaxis("GDP",[30,20,10])

# 设置全局变量 set_global_opts pos-position

line.set_global_opts(

    title_opts=TitleOpts("国际GDP展示",pos_left="center",pos_bottom="1%"),

    legend_opts=LegendOpts(is_show=True),

    toolbox_opts=ToolboxOpts(is_show=True),

    visualmap_opts=VisualMapOpts(is_show=True)

)

# 通过render方法,将代码生成为图像

line.render()

3、数据处理

懒人工具-json在线解析-在线JSON格式化工具-json校验-程序员必备  在线懒人工具 --json数据格式处理

4、案例实现

案例实现--折线图 2020年印美日新冠累计确诊人数

"""

演示可视化需求1:折线图开发

"""

import json

from pyecharts.charts import Line

from pyecharts.options import TitleOpts,LabelOpts

# 处理数据

f_us = open("E:\BaiduNetdiskDownload\Python课件\资料\可视化案例数据\折线图数据\美国.txt",'r',encoding='UTF-8')

us_data = f_us.read()

f_jp = open("E:\BaiduNetdiskDownload\Python课件\资料\可视化案例数据\折线图数据\日本.txt",'r',encoding='UTF-8')

jp_data = f_jp.read()

f_in = open("E:\BaiduNetdiskDownload\Python课件\资料\可视化案例数据\折线图数据\印度.txt",'r',encoding='UTF-8')

in_data = f_in.read()

# 去掉不合json规范的开头

us_data = us_data.replace('jsonp_1629344292311_69436(','')

jp_data = jp_data.replace('jsonp_1629350871167_29498(','')

in_data = in_data.replace('jsonp_1629350745930_63180(','')

# 去掉不合json规范的结尾 序列切片 切到倒数第二个 尾巴不包含所以取到-2

us_data = us_data[:-2]

jp_data = jp_data[:-2]

in_data = in_data[:-2]

# json转Python字典

us_dict = json.loads(us_data)

jp_dict = json.loads(jp_data)

in_dict = json.loads(in_data)

# 获取trend key

us_trend_data = us_dict['data'][0]['trend']

jp_trend_data = jp_dict['data'][0]['trend']

in_trend_data = in_dict['data'][0]['trend']

# 获取日期数据,用于X轴 取2020年到314下标结束

us_x_data = us_trend_data['updateDate'][:314]

jp_x_data = jp_trend_data['updateDate'][:314]

in_x_data = in_trend_data['updateDate'][:314]

# 获取确认数据,用于Y轴 取2020年到314下标结束

us_y_data = us_trend_data['list'][0]['data'][:314]

jp_y_data = jp_trend_data['list'][0]['data'][:314]

in_y_data = in_trend_data['list'][0]['data'][:314]

# 制作图表

line = Line() # 构建折线图对象

# 添加X轴数据 X轴公用使用一个国家的数据即可

line.add_xaxis(us_x_data)

# 添加Y轴数据 Y不公用

line.add_yaxis("美国确诊人数",us_y_data,label_opts=LabelOpts(is_show=False))

line.add_yaxis("日本确诊人数",jp_y_data,label_opts=LabelOpts(is_show=False))

line.add_yaxis("印度确诊人数",in_y_data,label_opts=LabelOpts(is_show=False))

# 设置全局变量

line.set_global_opts(

    # 标题设置

    title_opts=TitleOpts(title='2020年美日印三国确诊人数对比折线图',pos_left='center',pos_bottom="1%")

)

# 生成图表

line.render()

# 关闭文件

f_us.close()

f_jp.close()

f_in.close()

地图的基础应用:

案例实现--地图1: 全国疫情地图--各省份确诊人数

"""

演示全国疫情可视化地图开发

"""

import json

from pyecharts.charts import Map

from pyecharts.options import *

# 读取数据文件

f = open("E:\BaiduNetdiskDownload\Python课件\资料\可视化案例数据\地图数据\疫情.txt",'r',encoding='UTF-8')

data = f.read()

f.close()

# 取全国各地的数据

# 将json字符串转化为python字典

data_dict = json.loads(data)

# 从字典中取出省份数据

province_data_list = data_dict["areaTree"][0]["children"]

# 组装每个省份和确诊人数为元组 并将各个省的数据都封装到列表内

data_list = []

for province_data in province_data_list:

    province_name = province_data["name"] # 省份名称

    province_confirm = province_data["total"]["confirm"] # 确诊人数

    data_list.append((province_name,province_confirm))

print(data_list)

# 添加地图

map = Map()

map.add("各省份确诊人数",data_list,"china")

# 设置全局变量,定制分段的视觉映射

map.set_global_opts(

    title_opts=TitleOpts(title="全国疫情地图"),

    visualmap_opts=VisualMapOpts(

        is_show=True,  # 是否显示

        is_piecewise=True,  # 是否分段

        pieces=[

            {"min": 1, "max": 99, "label": "1-99人", "color": "#EEEED1"},

            {"min": 100, "max": 999, "label": "100-999人", "color": "#FFC1C1"},

            {"min": 1000, "max": 4999, "label": "1000-4999人", "color": "#FF6A6A"},

            {"min": 5000, "max": 9999, "label": "5000-9999人", "color": "#FFD700"},

            {"min": 10000, "max": 99999, "label": "10000-99999", "color": "#FF6347"},

            {"min": 100000,  "label": "100000+", "color": "#DC143C"}

        ]

    )

)

map.render()

案例实现--地图2: 河南省疫情地图绘制

"""

演示河南省的疫情地图

"""

import json

from pyecharts.charts import *

from pyecharts.options import *

# 读取数据文件

f = open("E:\BaiduNetdiskDownload\Python课件\资料\可视化案例数据\地图数据\疫情.txt",'r',encoding='UTF-8')

data =f.read()

# 关闭文件

f.close()

# 将json数据---python字典

data_dict = json.loads(data)

# 取河南省的数据

data_list = data_dict["areaTree"][0]["children"][3]["children"]

# 取河南省各个市的数据

res_list = []

for data in data_list:

    name = data["name"]+"市"

    num = data["total"]["confirm"]

    res_list.append((name,num))

print(res_list)

# 单独添加济源市数据

res_list.append(('济源市',5))

# 添加地图

map = Map()

# 在地图中添加数据

map.add("河南确诊人数",res_list,"河南")

# 设置地图全局配置

map.set_global_opts(

    title_opts=TitleOpts(title="河南疫情地图"),

    visualmap_opts=VisualMapOpts(

        is_show=True,

        is_piecewise=True,

        pieces=(

            {"min":1,"max":9,"label":"1-9","color":"#EEEED1"},

            {"min":10,"max":99,"label":"10-99","color":"#FFC1C1"},

            {"min":100,"max":999,"label":"100-999","color":"#FF6A6A"},

            {"min":1000,"max":9999,"label":"1000-9999","color":"#FF0000"}

        )

    )

)

map.render()

动态柱状图-- 基础时间线柱状图

  • 通过Bar构建基础柱状图  --柱状图添加x,y数据 传入的为list对象

  • 反转X和Y轴

  • 数值标签设在右侧

  • 创建时间线

  • 设置自动播放

  • 时间线设置主题

"""

带有时间线的柱状图开发

"""

from pyecharts.charts import Bar,Timeline

from pyecharts.options import *

from pyecharts.globals import ThemeType

bar1 =Bar()

bar1.add_xaxis(["中国","美国","英国"])

bar1.add_yaxis("GDP",[30,20,10],label_opts=LabelOpts(position="right"))

bar1.reversal_axis()

bar2 =Bar()

bar2.add_xaxis(["中国","美国","英国"])

bar2.add_yaxis("GDP",[50,30,20],label_opts=LabelOpts(position="right"))

bar2.reversal_axis()

bar3 =Bar()

bar3.add_xaxis(["中国","美国","英国"])

bar3.add_yaxis("GDP",[60,60,30],label_opts=LabelOpts(position="right"))

bar3.reversal_axis()

# 构建时间线对象-- 同时设置主题

timeline = Timeline({"theme":ThemeType.LIGHT})

# 在时间线内添加柱状图对象

timeline.add(bar1,"点1")

timeline.add(bar2,"点2")

timeline.add(bar3,"点3")

# 自动播放设置

timeline.add_schema(

    play_interval=1000,     # 自动播放的时间间隔 单位毫秒

    is_timeline_show=True,  # 是否在自动播放的时候显示时间线

    is_auto_play=True,      # 是否自动播放

    is_loop_play=True       # 是否循环自动播放

)

# 主题设置

# 绘图-使用时间线对象绘制,而不是bar对象

timeline.render("基础时间线柱状图.html")

动态柱状图-- GDP动态柱状图

  • 列表的sort方法 :

       在前面我们学习过sorted函数,可以对数据容器进行排序。在后面的数据处理中,我们需要对列表进行排序,并指定排序规则,sorted函数就无法完成了。 我们补充学习列表的sort方法。 

       使用方式: 列表.sort(key=选择排序依据的函数, reverse=True|False) 

      · 参数key,是要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据 

      · 参数reverse,是否反转排序结果,True表示降序,False表示升序 

"""

拓展列表的sort方法

在学习了将函数作为参数传递后,我们可以学习列表的sort方法来对列表进行自定义排序

"""

# 准备列表

my_list = [['a',22],['b',33],['c',44],['d',11]]

# 排序-基于带名函数

# def choose_sort_key(element):

#     return element[1]

# my_list.sort(key=choose_sort_key,reverse=False)

# print(my_list)

# 排序 -基于lambda匿名函数

my_list.sort(key=lambda element:element[1],reverse=False)

print(my_list)

  • 需求分析:

     1. GDP数据处理为亿级

     2. 有时间轴,按照年份为时间轴的点 

     3. x轴和y轴反转,同时每一年的数据只要前8名国家 

     4. 有标题,标题的年份会动态更改 

     5. 设置了主题为LIGHT

  • 数据处理:

    将数据转换为字典存储,格式为:{ 年份: [ [国家, gdp], [国家,gdp], ......  ], 年份: [ [国      家, gdp], [国家,gdp], ......  ], ......

代码实现:

"""

演示第三个图表,GDP动态柱状图开发

"""

from pyecharts.charts import Bar,Timeline

from pyecharts.options import *

from pyecharts.globals import *

# 读取数据

f = open("E:/1960-2019全球GDP数据.csv",'r',encoding='GB2312')

data_lines = f.readlines()

# 关闭文件

f.close()

# 删除不必要数据 --第一条

data_lines.pop(0)

# 将数据转化为字典格式

完整代码在zip包中

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值