Python学习笔记(11) --数据可视化

传送门==>B站黑马python入门教程


目录


1. json数据格式



什么是Json

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

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

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

    • 国际通用语言
    • 普通话

JSON的数据格式要求比较严格,例如

{name:"张三",age:18,sex:"男"}

{name:"张三",age:18,sex:"男"},{name:"张三1",age:18,sex:"男"}

如何转换数据

python 复制代码
# 导入 json 模块
import json
# 定义 json 字符串
json_str = '{"name":"张三","age":18,"sex":"男"},{name:"张三1",age:18,sex:"男"}'
# python转json,#包含中文时 需要设置ensure_ascii=False
json_ = json.dumps(json_str, ensure_ascii=False)
print(json_)
print(type(json_))

str = '[{"name":"张三","age":18,"sex":"男"}]'
# json转python
python_dict = json.loads(str)
print(python_dict)
print(type(python_dict))

2.pyecharts模块

  • 若想要做出数据可视化效果图,可借助pyecharts模块完成
  • Echarts 是一个基于 JavaScript 的开源可视化图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari,Oprea,iOS,Android),提供直观,生动,可交互,可高度个性化定制的数据可视化图表。

https://pyecharts.org/
https://gallery.pyecharts.org/

折线图

python 复制代码
"""
折线图基础
"""
# 导包,导入line功能来构建折线图对象;
from pyecharts.charts import Line
# 得到折线对象
line = Line()
# 添加X轴数据
line.add_xaxis(["1月","2月","3月","4月","5月","6月"])
# 添加Y轴数据
line.add_yaxis("折线图",[10,20,30,40,50,60])
# 生图
line.render("折线图.html")

在浏览器中打开


配置选项

  • 全局配置
  • 系列配置
python 复制代码
"""
折线图基础
"""
# 导包,导入line功能来构建折线图对象;
from pyecharts.charts import Line
from pyecharts import options as opts

# 得到折线对象
line = Line()
# 添加X轴数据
line.add_xaxis(["1月","2月","3月","4月","5月","6月"])
# 添加Y轴数据
line.add_yaxis("折线图",[10,20,30,40,50,60])

# 设置全局配置项
line.set_global_opts(
    # 标题;- pos_left左侧位置,-pos_bottom 底部位置;
    title_opts=opts.TitleOpts(title="折线图",pos_left="center",pos_bottom="1%"),
    # 图例;
    legend_opts=opts.LegendOpts(is_show=True),
    # 工具
    toolbox_opts=opts.ToolboxOpts(is_show=True),
    # 提示框;
    tooltip_opts=opts.TooltipOpts(is_show=True),
)

# 生图
line.render("折线图.html")

案例练习

python 复制代码
# 从资料包中获取数据
import json

# 进行处理处理,去除不规范的部分;
f_us = open("F:/pythonworkspace/startDemo/fileDemopath/美国.txt", "r", encoding="utf-8")
f_jp = open("F:/pythonworkspace/startDemo/fileDemopath/日本.txt", "r", encoding="utf-8")
f_in = open("F:/pythonworkspace/startDemo/fileDemopath/印度.txt", "r", encoding="utf-8")

us_data = f_us.read()
us_data = us_data.replace("jsonp_1629344292311_69436(", "")
us_data = us_data[:-2]
jp_data = f_jp.read()
jp_data = jp_data.replace("jsonp_1629350871167_29498(", "")
jp_data = jp_data[:-2]
in_data = f_in.read()
in_data = in_data.replace("jsonp_1629350745930_63180(", "")
in_data = in_data[:-2]
# 转换为python对象
py_us_dict = json.loads(us_data)
py_jp_dict = json.loads(jp_data)
py_in_dict = json.loads(in_data)

# trend 数据
us_trend_dict = py_us_dict["data"][0]["trend"]
jp_trend_dict = py_jp_dict["data"][0]["trend"]
in_trend_dict = py_in_dict["data"][0]["trend"]
# 日期数据 -2020年
us_date_list = us_trend_dict["updateDate"][:314]
jp_date_list = jp_trend_dict["updateDate"][:314]
in_date_list = in_trend_dict["updateDate"][:314]

us_y_data=us_trend_dict["list"][0]["data"][:314]
jp_y_data=jp_trend_dict["list"][0]["data"][:314]
in_y_data=in_trend_dict["list"][0]["data"][:314]

# 生图
from pyecharts.charts import Line
from pyecharts.options import TitleOpts
line = Line()
line.add_xaxis(us_date_list)
line.add_yaxis("美国确诊",us_y_data)
line.add_yaxis("日本确诊",jp_y_data)
line.add_yaxis("印度确诊",in_y_data)
# 标题
line.set_global_opts(
    title_opts=TitleOpts(title="确诊案例分析折线图",
                         pos_left="center",
                         pos_bottom="1%"
                         )
)
line.render("案例折线图.html")

# 关闭文件
f_us.close()
f_jp.close()
f_in.close()

地图


案例

python 复制代码
# 地图

from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts

map = Map()
data = [
    ("北京", 100),
    ("上海", 80),
    ("广州", 60),
    ("深圳", 40),
    ("杭州", 30),
    ("西安", 20),
    ("武汉", 10),
    ("南京", 5),
    ("成都", 2),
    ("天津", 1),
]
map.add("地图", data, "china")
# 生图
map.render("地图.html")

全局配置项

视觉映射器配置

python 复制代码
# 地图
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
from pyecharts.options import TitleOpts

map = Map()
data = [
    ("北京", 100),
    ("上海", 80),
    ("广州", 60),
    ("深圳", 40),
    ("杭州", 30),
    ("西安", 20),
    ("武汉", 10),
    ("南京", 5),
    ("成都", 2),
    ("天津", 1),
]
map.add("地图", data, "china")
# 生图

# 设置全局配置项
map.set_global_opts(
    title_opts=TitleOpts(title="地图"),
    visualmap_opts=VisualMapOpts(
        # 是否显示
        is_show=True,
        # 是否分段
        is_piecewise=True,
        # 分段
        pieces=[ {"min": 1, "max": 10, "label": "1-10", "color": "#d94e5d"},
                 {"min": 10, "max": 20, "label": "10-20", "color": "#eac736"},
                  {"min": 20, "max": 30, "label": "20-30", "color": "#50a3ba"},
                  {"min": 30, "max": 40, "label": "30-40", "color": "#eac736"},
                  {"min": 40, "max": 50, "label": "40-50", "color": "#eac736"},
                  {"min": 50, "max": 60, "label": "50-60", "color": "#eac736"},
                  {"min": 60, "max": 70, "label": "60-70", "color": "#eac736"},]
    ),
)
map.render("地图.html")

案例

python 复制代码
"""
案例疫情地图
"""
import json
from pyecharts.charts import Map
from pyecharts.options import TitleOpts, VisualMapOpts

# 读取数据文件;
f = open("F:/pythonworkspace/startDemo/fileDemopath/疫情.txt", "r", encoding="utf-8")
data =f.read()
f.close()

data_reverse = json.loads(data)
# 省份数据
data_list = data_reverse["areaTree"][0]["children"]
# 省份 确诊数据
real_data = []
for province_data in data_list :
    province_name = province_data["name"]
    province_confirm = province_data["total"]["confirm"]
    real_data.append((province_name,province_confirm))

print(real_data)

# 创建地图对象;
map = Map()
map.add("疫情地图",real_data,"china")

map.set_global_opts(
    title_opts=TitleOpts(title="疫情地图"),
    visualmap_opts=VisualMapOpts(
        # 是否显示
        is_show=True,
        # 是否分段
        is_piecewise=True,
        # 分段
        pieces=[ {"min": 1, "max": 10, "label": "1-10", "color": "#d94e5d"},
                 {"min": 10, "max": 20, "label": "10-20", "color": "#eac736"},
                  {"min": 20, "max": 30, "label": "20-30", "color": "#50a3ba"},]
    )
)
map.render("疫情地图.html")
print("生成完成")

柱状图

基础柱状图案例

python 复制代码
"""
基础柱状图
"""
from pyecharts.charts import Bar
from pyecharts.options import *

# 创建柱状图对象
bar = Bar()
bar.add_xaxis(["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"])
bar.add_yaxis("商家A",[5,20,36,10,75,90])
bar.set_global_opts(
    title_opts=TitleOpts(title="案例柱状图",
                         pos_left="center",
                         pos_bottom="1%"
                         ),
    visualmap_opts=VisualMapOpts(
        # 是否显示
        is_show=True,
        # 是否分段
        is_piecewise=True,
        # 分段
        pieces=[]
    )
)

bar.render("案例柱状图.html")

时间线柱状图

TimeLine() -时间线

案例练习

python 复制代码
"""
TimeLine() -时间线
"""

from pyecharts.charts import Timeline
from pyecharts.charts import Bar
from pyecharts.options import *
from pyecharts.globals import *

bar1 = Bar()
bar1.add_xaxis(["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"])
bar1.add_yaxis("价格",[5,25,36,10,75,6])
bar1.reversal_axis()

bar2 = Bar()
bar2.add_xaxis(["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"])
bar2.add_yaxis("价格",[3,20,36,16,56,3])
bar2.reversal_axis()

bar3 = Bar()
bar3.add_xaxis(["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"])
bar3.add_yaxis("价格",[2,20,36,56,109,9])
bar3.reversal_axis()

# 时间线对象
timeline = Timeline({"theme":"macarons"})
timeline.add(bar1, "2021年")
timeline.add(bar2, "2022年")
timeline.add(bar3, "2023年")

# 自动动态轮播
timeline.add_schema(
    is_auto_play=True,#是否自动播放
    play_interval=1000,#播放间隔
    is_loop_play=True,#是否循环播放
    is_timeline_show=True#是否显示时间线
)


timeline.render("时间线.html")
print("生成完成")

动态柱状图

列表sort方法

sorted函数可以对容器进行排序;但是无法完成指定的排序规则;

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

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

例如在处理嵌套列表时,要对外层的列表进行排序,排序依据是内层列表中的第二个元素数字

  • 带名函数形式
python 复制代码
demo_list = [["A",18],["B",16],["C",19]]

# 排序方法
def choose_sort_key(item):
    return item[1]

# 确定用哪个元素来排序
demo_list.sort(key=choose_sort_key)
print(demo_list)
  • 匿名lambda形式
python 复制代码
demo_list2 = [["A",18],["B",16],["C",19]]

demo_list2.sort(key=lambda item:item[1],reverse=True)
print(demo_list2)

绘图案例

python 复制代码
"""
动态柱形图案例
"""
# 导包
import json
from pyecharts.charts import Bar
from pyecharts.charts.composite_charts import timeline
from pyecharts.options import *
from pyecharts.globals import *
from pyecharts.charts import Timeline

# 读取数据
f = open("F:/pythonworkspace/startDemo/fileDemopath/1960-2019全球GDP数据.csv", "r", encoding="GB2312")
local_data = f.readlines()
local_data.pop(0)# 首行标题不使用
f.close()

# 处理数据
data_dict = {}
for line in local_data:
    line_list = line.split(",")
    year = int(line_list[0])
    gdp = float(line_list[2])
    country = line_list[1]

    try:
        data_dict[year].append([country,gdp])
        print("添加成功")
    except KeyError:
        data_dict[year] = []
        data_dict[year].append([country, gdp])
        print("添加成功")

timeline = Timeline({"theme":"macarons"})
# 排序
sorted_year = sorted(data_dict.keys())
for year in sorted_year:
    data_dict[year].sort(key=lambda x:x[1],reverse=True)
    # 当年前八名
    data_list = data_dict[year][:8]
    x_dat=[]
    y_dat=[]
    for country_data in data_list:
        x_dat.append(country_data[0])
        y_dat.append(country_data[1]/100000000)

    bar = Bar()
    bar.add_xaxis(x_dat)
    bar.add_yaxis("GDP(亿元)",y_dat)
    bar.reversal_axis()

    timeline.add(bar, str(year))


# 自动动态轮播
timeline.add_schema(
        is_auto_play=True,  # 是否自动播放
        play_interval=1000,  # 播放间隔
        is_loop_play=True,  # 是否循环播放
        is_timeline_show=True ) # 是否显示时间线)

timeline.render("GDP.html")

相关推荐
历程里程碑2 小时前
hot 206
java·开发语言·数据结构·c++·python·算法·排序算法
Coder_Boy_2 小时前
Java+Proteus仿真Arduino控制LED问题排查全记录(含交互过程)
java·人工智能·python
qq_356196952 小时前
day47_预训练模型与迁移学习@浙大疏锦行
python
Tipriest_2 小时前
C++ 的 ranges 和 Python 的 bisect 在二分查找中的应用与实现
c++·python·算法·二分法
老歌老听老掉牙2 小时前
符号计算中的表达式等价性验证:数学等价性与计算简化策略分析
python·数学建模·sympy
scan7243 小时前
向量数据库检索
python
摸鱼仙人~3 小时前
一文详解PyTorch DDP
人工智能·pytorch·python
超级种码3 小时前
Java:JavaAgent技术(java.instrument和java.attach)
java·开发语言·python
么么...4 小时前
在 Ubuntu 上安装 Docker 并部署 MySQL 容器
linux·运维·经验分享·笔记·mysql·ubuntu·docker