数据可视化

数据可视化(pyecharts)

JSON数据格式

知道什么是JSON

JSON是一种轻量级的数据交互格式,可以按照JSON指定的格式去组织和封装数据,本质上是一个带有特定格式的字符串

主要功能 :JSON负责不同编程语言中的数据传递和交互

JSON格式数据转化

JSON数据的格式可以是:


{"name":"admin","age":18}
#或
[{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]

python数据和json数据的相互转化

#导入json模块
import json
#准备符合格式json格式要求的py数据
data = [{"name":"老王""age":16},{"name":"张三""age" :20}]
#通过json.dumps(data)方法把python数据转化为了json数据
data = json.dumps(data)
#通过json.loads(data)方法把json数据转化为了py数据
data = json.loads(data)

pyecharts模块介绍

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

概况:Echarts是个由百度开源数据可视化,凭借着良好的交互性,精巧的图标设计,的刀客众多开发者的认可,而python是门富有表达力的语言,很适合用于数据处理,当数据分析遇上数据可视化时pyecharts诞生了

pyechats操作

pyecharts入门

基础折线图
#导包,导入Line功能构建折线图对象
from pyechats.charts import Line
#得到折线图对象
line = Line()
#添加x轴数据
line.add_xaxis(["中国""美国""英国"])
#添加y轴数据
line.aaa_yaxis("GDP",[30,20,10]) #数据分别对应x轴 例如:中国➡️30
#生成图表
line.render()

在这里插入图片描述

pyecharts配置选项

pyecharts中有很多配置选项,常用的有两类

全局配置选项

针对整个图像进行设置 例如:图像的标题,图像的图例,工具箱

系列配置选项

针对具体的轴数据进行配置

set_global_opts方法

这里全局配置选项可以通过set_global_opts方法来进行配置

#导可配置选项包
from pyecharts.options import TitleOpts,LegendOpts,ToolboxOpts,VisualMapOpts #标题,图例,工具箱,视觉映射控制选项
#设置全局配置项
#title.opts指设置标题  
#pos指位置 left指靠近左边有多远 bottom指距离底部有多远 center指居中
#lengend_opts指设置图例
#is_show指是否展示
#toolbox_opts指设置工具箱
line.set_global_opts(
    title_opts = TitleOpts(title = "GDP展示",pos_left = "center",pos_bottom = "1%"),
    lengend_opts = LegendOpts(is_show = True),
    toolbox_opts = ToolboxOpts(is_show = True),
    visualmap_opts = VisualMapOpts(is_show = True)
)

详细配置项可查看

折线图开发

数据处理

可先通过第三方网站对数据进行梳理

import json
#处理数据
f_us = open("D:\个人文件\新建文件夹 (2)\资料\第1-12章资料\资料\资料\可视化案例数据\折线图数据\美国.txt","r",encoding = "UTF-8")
us_data = f_us.read()
#去掉不合json规范的开头
us_data = us_data.replace("jsonp_1629344292311_69436(","")   #替换为空白
#去掉不合json规范的结尾
#采用序列切片的方式去除后两个符号
us_data = us_data[:-2]
#json转python字典
us_dict = json.loads(us_data)
#获取trend key
us_trend_data = us_dict["data"][0"["trend"]
#获取日期数据用于x轴,取2020年(到314下标结束)
us_x_data = us_trend_data["updateDate"][:314]
#获取确认数据用于y轴,取2020年   (确诊人数)
us_y_data = us_trend_data["list"][0]["data"][:314]

创建折线图

引入pyecharts包并完成剩余两个国家数据处理

再进行全局配置选项设置

import json
from pyecharts.charts import Line
from pyecharts.options import TitleOpts,LabelOpts
#处理数据
f_us = open("D:\个人文件\新建文件夹 (2)\资料\第1-12章资料\资料\资料\可视化案例数据\折线图数据\美国.txt","r",encoding = "UTF-8")
us_data = f_us.read()

f_jp = open("D:\个人文件\新建文件夹 (2)\资料\第1-12章资料\资料\资料\可视化案例数据\折线图数据\日本.txt","r",encoding = "UTF-8")
jp_data = f_jp.read()

f_in = open("D:\个人文件\新建文件夹 (2)\资料\第1-12章资料\资料\资料\可视化案例数据\折线图数据\印度.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规范的结尾
#采用序列切片的方式去除后两个符号
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年   (确诊人数)
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轴数据                       还可以进行系列配置 label指的是图例中数字设置
line.add_yaxis("美国确诊人数",us_y_data, label_opts = LabelOpts(is_show = False)) #添加美国的y轴数据
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 = TitleOtps(title = "2020年美日印三国确诊人数对比折线图",pos_left = "center",pos_bottom = "1%")
)
#调用render方法生成图表
line.render()
#关闭文件
f_us.close()
f_jp.close()
f_in.close()

效果图:在这里插入图片描述

地图可视化

基础地图演示

#准备地图对象
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
map = Map()
#准备数据 列表里嵌套元组
data = [
    ("北京市",99),
    ("上海市",199),
    ("湖南省",299),
    ("台湾省",399),
    ("广东省",499),
]
#添加数据   名称     数据   地图类型
map.add("测试地图",data,"china")
#设置全局选项
map.set_global_opts(
    #可视化地图设置
    visualmap_opts = VisualMapOpts(
        is_show = True,
        #开启手动校准范围
        is_piecewise = True#具体范围  列表中每个元素为字典
        piece = [
            {"min" : 1 ,"max" : 9,"label":"1-9","color" :"#CCFFFF"},
            {"min" : 10 ,"max" : 99,"label":"10-99","color" :"#FF6666"},
            {"min" : 100 ,"max" : 500,"label":"100-500","color" :"#990033"}
        ]
    )
)
#绘图
map.render()

效果图:

在这里插入图片描述

疫情地图-国内疫情地图

import json
from pyecharts.charts import Map
from pyecharts.optinons import *
#读取数据文件
f = open("D:\个人文件\新建文件夹 (2)\资料\第1-12章资料\资料\资料\可视化案例数据\地图数据\疫情.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))
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,"lable":"1~99人","color":"#CCFFFF"},
            {"min":100,"max":999,"lable":"100~999人","color":"#FFFF99"},
            {"min":1000,"max":4999,"lable":"1000~4999人","color":"#FF9966"},
            {"min":5000,"max":9999,"lable":"5000~9999人","color":"#FFF6666"},
            {"min":10000,"max":99999,"lable":"10000~99999人","color":"#CC3333"},
            {"min":100000,"lable":"100000+人","color":"#990033"},
        ]
    )
)
#绘制
map.render("全国疫情地图.html")

效果图:

在这里插入图片描述

河北省疫情地图

import json
from pyecharts.charts import Map
from pyecharts.options import *
f = open("D:\个人文件\新建文件夹 (2)\资料\第1-12章资料\资料\资料\可视化案例数据\地图数据\疫情.txt","r",encoding="UTF-8")
data = f.read()
f.close()
data_dict = json.loads(data)
city_data = data_dict["areaTree"][0]["children"][32]["children"]
city_data_list = []
for city_data in city_data :
    city_name = city_data["name"]
    city_confirm = city_data["total"]["confirm"]
    city_data_list.append((city_name,city_confirm))
map = Map()
map.add("河北省确诊人数",city_data_list,"河北")
map.set_global_opts(
    title_opts = TitleOpts(title = "河北省疫情地图"),
    visualmap_opts = VisualMapOpts(
        is_show = True,  #是否显示
    	is_piecewise = True, #是否分段
        pieces = [
            {"min":1,"max":99,"lable":"1~99人","color":"#CCFFFF"},
            {"min":100,"max":999,"lable":"100~999人","color":"#FFFF99"},
            {"min":1000,"max":4999,"lable":"1000~4999人","color":"#FF9966"},
            {"min":5000,"max":9999,"lable":"5000~9999人","color":"#FFF6666"},
            {"min":10000,"max":99999,"lable":"10000~99999人","color":"#CC3333"},
            {"min":100000,"lable":"100000+人","color":"#990033"},
        ]
    )
)
map.render("河北省疫情地图.html")

效果图:在这里插入图片描述

柱状图绘制

绘制基础柱状图

通过bar构建基础柱状图(可反转x y轴)

from pyechats.charts import Bar
bar = Bar()
bar.add_xaxis(["中国","美国","英国"])
#添加y轴数据并将数值放在图表右侧
bar.add_yaxis("GDP",[30,20,10],label_opts = LabelOpts(
    position = "right"
))
#反转x轴和y轴
bar.reversal_axis()
bar.render("基础柱状图.html")

效果图

在这里插入图片描述

基础时间线柱状图绘制

TimeLine() --时间线

柱状图描述的是分类数据,回答的是每一个分类中【有多少?】这个问题,这是柱状图的主线特点,同时柱状图很难动态的描述一个趋势性数据,这里pyecharts为我们提供了一种解决方案------时间线

from pyecharts.charts import Bar,Timeline
from pyecharts.options import LabelOpts
from pyecharts.globals import ThemeType #柱状图主题设置
bar1 = Bar()
bar1.add_xaxis(["中国","美国","英国"])
#添加y轴数据并将数值放在图表右侧
bar1.add_yaxis("GDP",[30,20,10],label_opts=LabelOpts(position="right"))
#反转x轴和y轴
bar1.reversal_axis()

bar2 = Bar()
bar2.add_xaxis(["中国","美国","英国"])
#添加y轴数据并将数值放在图表右侧
bar2.add_yaxis("GDP",[50,50,20],label_opts=LabelOpts(position="right"))
#反转x轴和y轴
bar2.reversal_axis()

bar3 = Bar()
bar3.add_xaxis(["中国","美国","英国"])
#添加y轴数据并将数值放在图表右侧
bar3.add_yaxis("GDP",[70,60,50],label_opts=LabelOpts(position="right"))
#反转x轴和y轴
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使用方法补充

列表.sort(key = 选择排列依据的函数,reverse = True/False)

  • 参数key,是要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
  • 参数reverse,是否反转排序结果,True表示降序,False表示升序

带名函数形式

#如下嵌套列表,要求对外层列表进行排列,排序的依据是内层列表的第二个元素数字
my_list = [["a",33],["b",55],["c",11]]
#定义排序方法
def choose_sort_key(element) :
    return element[1]
my_list.sort(key = choose_sort_key,reverse = True)
print(my_list)
#输出结果为[["b",55],["a",33],["c",11]]

匿名lambda形式

my_list = [["a",33],["b",55],["c",11]]
my_list.sort(key = lambda element : element[1],reverse = True)
print(my_list)
#输出结果与上相同
数据处理
#读取文件
f = open("D:\个人文件\新建文件夹 (2)\资料\第1-12章资料\资料\资料\可视化案例数据\动态柱状图数据\1960-2019全球GDP数据.csv","r",encoding = "GB2312")#简体中文去读取文件
data_lines = f.readlines()
f.close()
#删除第一行数据
data_lines.pop(0)
#将数据格式转换为字典格式,格式为
#{"年份" :[["国家",GDP],["国家",GDP]......],"年份" :[["国家",GDP],["国家",GDP]......]}
#先定义字典
data_dict = {}
for line in data_lines :
    year = int(line.split(",")[0]) #通过逗号分割,然后读取年份
    country = line.split(",")[1] #读取国家
    gdp = float(line.split(",")[2]) #数据中存在科学计数法,可通过将其转变为浮点数的方式进行处理
    try :
        data_dict[year].append([country,gdp]) #第一次执行字典中并没有指定的key,会报错进而创建空的列表,之后再将国家数据放入新列表中
    except KeyError :
        data_dict[year] = []
        data_dict[year].append([country,gdp])
 #得到了各个年份各个国家对应的gdp值
绘图
from pyecharts.charts import Bar,TimeLine
from pyecharts.options import *
from pyecharts.globals import ThemeType
timeline = TimeLine("theme" : ThemeType.LIGHT)#设置主题
#排序年份     将字典中的key全部取出
sorted_list = sorted(data_dict.keys())
for year in sorted_list :       #在一年中对国家gdp从大到小进行排序
    data_dict[year].sort(key = lambda element : element[1],reverse = True)
    #取出本年份前八名的国家
    year_data = data_dict[year][0:8]
    x_data = []
    y_data = []
    #处理x轴和y轴数据
    for country_gdp in year_data :
        x_data.append(country_gdp[0]) #为x轴添加国家
        y_data.append(country_gdp[1]/100000000) #为y轴添加gdp数据  以亿为单位
    #构建柱状图
    bar = Bar()
    #先将x轴和y轴数据反转 使得图表反转后最大值在上面
    x_data.reverse()
    y_data.reverse()
    bar.add_xaxis(x_data)
    bar.add_yaxis("GDP(亿)",y_data,label_opts = LabelOpts(position = "right")) #数据在列表右边
    #反转x轴和y轴
    bar.reversal_axis()
    #设置每一年的图表标题
    bar.set_global_opts(
        title_opts=TitleOpts(title = f"{year}年全球前8GDP数据")
    )
    #为时间线添加图表
    timeline.add(bar,str(year))
#设置时间线自动播放
timeline.add_schema(
    play_interval=1000,#自动播放时间间隔,单位毫秒
    is_timeline_show=True, #是否显示时间线
    is_auto_play=True, #是否自动播放
    is_loop_play=False #是否循环播放
)
#绘图
timeline.render("1960-2019全球GDP前8国家.html")
  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值