python入门(十)——基础综合案例之可视化

本文围绕Python展开,介绍了JSON数据格式转换,包括其定义、格式及与Python数据的相互转化。还讲解了pyecharts模块,如基础折线图、地图、柱状图等的使用,以及时间线柱状图的创建和设置。最后给出了折线图、地图、动态柱状图等可视化综合案例。

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

上期文章

python入门(九)——python异常、模块与包



一、json数据格式的转换

什么是json

  • 一种轻量级的数据交换格式,可以按照json指定的格式去组织和封装数据
  • 本质上是一个带有特定格式的字符串
  • 是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互

就是字符串,无非就是一个单独的字典或者一个内部元素都是字典的列表

各种编程语言存储数据的容器不尽相同,在python中字典dict这样的数据类型,在其他语言中可能没有对应的字典

为了能让不同的语言能够相互通用的互相传递数据,json就是一种非常良好的中转数据格式
在这里插入图片描述

json格式数据化

列表和字典格式

# json数据的格式可以是:
{"name":"admin","age":18}

# 也可以是:
[{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]

python数据和json数据相互转化

json中的字符串表示要用单引号

# 导入json模块
import json

# 准备符合json格式要求的python数据
data = [{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]

# 通过json.dumps(data)方法把python数据转化为json数据
# 如果有中文数据转换,加上ensure_ascii=False参数来确保中文正常转换
data = json.dumps(data, ensure_ascii=False)

# 通过json.loads(data)方法把json数据转化为python数据
data = json.loads(data)
import json
data = [{"name": "admin", "age": 18}, {"name": "root", "age": 16}, {"name": "张三", "age": 20}]
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)
print(type(json_str))

[{"name": "admin", "age": 18}, {"name": "root", "age": 16}, {"name": "张三", "age": 20}]
<class 'str'>

s = '[{"name": "admin", "age": 18}, {"name": "root", "age": 16}, {"name": "张三", "age": 20}]'
s_python = json.loads(s)
print(s_python)
print(type(s_python))

[{'name': 'admin', 'age': 18}, {'name': 'root', 'age': 16}, {'name': '张三', 'age': 20}]
<class 'list'>

二、pyecharts模块

基础折线图

from pyecharts.charts import Line
line = Line()   # 创建line对象
line.add_xaxis(['中国', '美国', '英国'])
line.add_yaxis('GDP', [30, 20, 10])
line.render()

文件中出现html文件,打开之后选择右上角html浏览器打开方式
在这里插入图片描述
在这里插入图片描述

全局配置选项

针对整个图像进行设置,比如图像的标题、图例和工具箱等

set_global_opts方法
在这里插入图片描述

from pyecharts.charts import Line
from pyecharts.options import *
line = Line()   # 创建line对象
line.add_xaxis(['中国', '美国', '英国'])
line.add_yaxis('GDP', [30, 20, 10])
line.set_global_opts(
    title_opts=TitleOpts(title='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),
)
line.render()

在这里插入图片描述

系列配置选项

针对具体的轴数据进行设置,比如对y轴的数据进行个性化的配置

基础地图

from pyecharts.charts import Map
from pyecharts.options import *

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,
        pieces=[
            {'min': 1, 'max': 9, 'lable': '1-9', 'color': '#CCFFFF'},
            {'min': 10, 'max': 99, 'lable': '10-99', 'color': '#FF6666'},
            {'min': 100, 'max': 500, 'lable': '100-500', 'color': '#990033'}
        ]
    )
)
map.render()

在这里插入图片描述

基础柱状图

from pyecharts.charts import Bar
from pyecharts.options import *
bar = Bar()
bar.add_xaxis(['中国', '美国', '英国'])
bar.add_yaxis('GDP', [30, 20, 10], label_opts=LabelOpts(position='right'))
bar.reversal_axis() # 旋转柱状图的方向,使其变为横向
bar.render('基础柱状图.html')

在这里插入图片描述

基础时间线柱状图

创建时间线Timeline()

如果一个Bar、Line对象是一张图表,时间线就是创建一个一维x轴,轴上每一个点就是一个图表对象
在这里插入图片描述

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

bar1 = Bar()
bar1.add_xaxis(['中国', '美国', '英国'])
bar1.add_yaxis('GDP', [30, 30, 20], label_opts=LabelOpts(position='right'))
bar1.reversal_axis()
bar1.render('基础柱状图.html')

bar2 = Bar()
bar2.add_xaxis(['中国', '美国', '英国'])
bar2.add_yaxis('GDP', [50, 50, 50], label_opts=LabelOpts(position='right'))
bar2.reversal_axis()

bar3 = Bar()
bar3.add_xaxis(['中国', '美国', '英国'])
bar3.add_yaxis('GDP', [70, 60, 60], label_opts=LabelOpts(position='right'))
bar3.reversal_axis()
bar3.render('基础柱状图.html')

timeline = Timeline()
timeline.add(bar1, '点1')
timeline.add(bar2, '点2')
timeline.add(bar3, '点3')

# 用时间线对象绘图
timeline.render('基础时间线柱状图.html')

在这里插入图片描述

时间线自动播放设置

add_schema

timeline = Timeline()
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   # 是否循环自动播放
)

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

时间线设置主题

from pyecharts.globals import Themetype
timeline = TimeLine(
	{"theme": ThemeType.LIGHT}
)

在这里插入图片描述

数据处理

json数据整理

网址:懒人工具json在线解析

1.选择json视图
在这里插入图片描述2.复制数据进行格式化
在这里插入图片描述
3.点击视图,可以看到文件里面的层级和内容结构
在这里插入图片描述

三、基础综合案例

折线图可视化案例

import json
from pyecharts.charts import Line
from pyecharts.options import *

f_us = open("美国.txt", 'r', encoding='UTF-8')
f_jp = open("日本.txt", 'r', encoding='UTF-8')
f_in = open("印度.txt", 'r', encoding='UTF-8')

us_data = f_us.read()
jp_data = f_jp.read()
in_data = f_in.read()

# 处理开头的数据
us_data = us_data.replace('jsonp_1629344292311_69436(', '')
jp_data = jp_data.replace('jsonp_1629350871167_29498(', '')
in_data = in_data.replace('jsonp_1629350745930_63180(', '')

# 处理结尾的数据);
us_data = us_data[:-2]
jp_data = jp_data[:-2]
in_data = in_data[:-2]

us_dict = json.loads(us_data)
jp_dict = json.loads(jp_data)
in_dict = json.loads(in_data)

us_trend_data = us_dict['data'][0]['trend']
jp_trend_data = jp_dict['data'][0]['trend']
in_trend_data = in_dict['data'][0]['trend']

# 取2020年的数据到314结束
us_x_data = us_trend_data['updateDate'][:314]
us_y_data = us_trend_data['list'][0]['data'][:314]

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

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

line = Line()
line.add_xaxis(us_x_data)
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、json数据准备

在这里插入图片描述
2、代码实现

import json
from pyecharts.charts import Map
from pyecharts.options import *

f = open('疫情.txt', 'r', encoding='UTF-8')
data = f.read()
f.close()
data_dict = json.loads(data)
province_data_list = data_dict['areaTree'][0]['children']
data_list = []

# 第一种方式
for province_data in province_data_list:
    province_confirm = province_data['total']['confirm']    # 确诊人数
    if province_data['name'] == '北京' or province_data['name'] =='上海' or province_data['name'] =='天津' or province_data['name'] =='重庆':
        province_name = province_data['name']+'市'
    elif province_data['name'] == '西藏' or province_data['name'] =='内蒙古':
        province_name = province_data['name'] + '自治区'
    elif province_data['name'] == '宁夏':
        province_name = province_data['name'] + '回族自治区'
    elif province_data['name'] == '新疆':
        province_name = province_data['name'] + '维吾尔自治区'
    elif province_data['name'] == '广西':
        province_name = province_data['name'] + '壮族自治区'
    else:
        province_name = province_data['name'] + '省'
    data_list.append((province_name, province_confirm))

# 第二种方式
for province_data in province_data_list:
    province_name = province_data['name']
    province_confirm = province_data['total']['confirm']    # 确诊人数
    if province_data['name'] == '北京' or province_data['name'] == '上海' or province_data['name'] == '天津' or province_data['name'] == '重庆':
        data_list.append((province_name+'市', province_confirm))
    elif province_data['name'] == '西藏' or province_data['name'] == '内蒙古':
        data_list.append((province_name+'自治区', province_confirm))
    elif province_data['name'] == '宁夏':
        data_list.append((province_name+'回族自治区', province_confirm))
    elif province_data['name'] == '新疆':
        data_list.append((province_name+'维吾尔自治区', province_confirm))
    elif province_data['name'] == '广西':
        data_list.append((province_name+'壮族自治区', province_confirm))
    else:
        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': '#FFF99'},
            {'min': 1000, 'max': 4999, 'lable': '1000-4999人', 'color': '#FF9966'},
            {'min': 5000, 'max': 9999, 'lable': '5000-99999人', 'color': '#FF6666'},
            {'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('疫情.txt', 'r', encoding='UTF-8')
data = f.read()
f.close()
data_dict = json.loads(data)
data_list = []
cities_data = data_dict['areaTree'][0]['children'][3]['children']
for city_data in cities_data:
    city_name = city_data['name'] + '市'
    if city_name == '济源示范区市':
        city_name = city_name[:2] + '市'
    city_confirm = city_data['total']['confirm']
    data_list.append((city_name, city_confirm))

map = Map()
map.add('河南省疫情分布', 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-99999人', 'color': '#FF6666'},
            {'min': 10000, 'max': 99999, 'lable': '10000-99999人', 'color': '#CC3333'},
            {'min': 100000, 'lable': '100000+', 'color': '#990033'}
        ]
    )
)
map.render('河南省疫情地图.html')

在这里插入图片描述

动态柱状图可视化案例

列表排序

列表.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)

# 排序二,基于lambda匿名函数
my_list.sort(key=lambda element: element[1], reverse=True)

print(my_list)

[['b', 55], ['a', 33], ['c', 11]] 
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType

f = open('1960-2019全球GDP数据.csv', 'r', encoding='GBK')
data_lines = f.readlines()
# 删除第一条无需使用的数据
data_lines.pop(0)

timeline = Timeline(
    {"theme": ThemeType.LIGHT}
)
# 将数据转换为字典储存,格式为:
# {年份:[[国家, gdp], [国家, gdp]..., [国家, gdp]]}
data_dict = {}
for line in data_lines:
    year = int(line.split(',')[0])
    country = line.split(',')[1]
    gdp = float(line.split(',')[2])
    # 如果没有对应的year key值
    try:
        data_dict[year].append([country, gdp])
    except KeyError:
        data_dict[year] = []
        data_dict[year].append([country, gdp])

# 按照键值key排序即按照年份排序
sorted_year_list = sorted(data_dict.keys())
for year in sorted_year_list:
    # 列表数据排序,取前8个国家
    data_dict[year].sort(key=lambda element: element[1], reverse=True)
    year_data = data_dict[year][0:8]
    x_data = []
    y_data = []
    for country_gdp in year_data:
        x_data.append(country_gdp[0])
        y_data.append(country_gdp[1]/100000000)

    bar = Bar()
    x_data.reverse()
    y_data.reverse()
    bar.add_xaxis(x_data)
    bar.add_yaxis('GDP(亿)', y_data, label_opts=LabelOpts(position='right'))
    bar.reversal_axis()

    bar.set_global_opts(
        title_opts=TitleOpts(title=f'{year}年全球前8 GDP国家')
    )

    timeline.add(bar, str(year))


timeline.add_schema(
    play_interval=1000,  # 自动播放的时间间隔,单位毫秒
    is_timeline_show=True,  # 是否在自动播放的时候显示时间线
    is_auto_play=True,  # 是否自动播放
    is_loop_play=True   # 是否循环自动播放
)

timeline.render('1960-2019全球GDP前8国家.html')

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值