数据准备&创建图表
获得json数据
观察json数据,处理:
f open打开文件
read全部数据
首尾是否要[]切片
json.loads将json转python字典
切片获取合适层级的key
设定x轴
设定y轴
render 生成图表,调整效果
地图-基本地图使用
示例:
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
map = Map()
# 准备数据
data = [
("北京市", 9),
("上海市", 19),
("湖南省", 299),
("台湾省", 3999),
("广东省", 49999),
]
# 添加数据
map.add("test map", data, "china")
# 设置全局选项
map.set_global_opts(
visualmap_opts=VisualMapOpts(
is_show=True, # 打开地图视觉指示器
is_piecewise=True, # 设置视觉指示器分段
pieces=[ # 分段具体设置
{"min": 1, "max": 9, "label": "1-9", "color": "#CCFFFF"},
{"min": 10, "max": 99, "label": "10-99", "color": "#FFFF99"},
{"min": 100, "max": 999, "label": "100-999", "color": "#FF6666"},
{"min": 1000, "max": 9999, "label": "1000-9999", "color": "#CC3333"},
{"min": 10000, "label": "10000以上", "color": "#990033"}
]
)
)
map.render(r"D:\CODE\testproject\test230228\可视化_地图\test_map.html")
全国疫情地图构建
黑马示例代码:
"""
演示全国疫情可视化地图开发
"""
import json
from pyecharts.charts import Map
from pyecharts.options import *
# 读取数据文件
f = open("D:/疫情.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~9999人", "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")
数据流向:
)))json数据(原始):疫情.txt
读取json数据:data
)))python字典:data_dict
)))省份数据列表:province_data_list
)))具体数据转化为元组
——>形成具体数据列表:data_list
基础柱状图构建
pyecharts官方示例:
from pyecharts.charts import Bar
from pyecharts import options as opts
c = (
Bar()
.add_xaxis(
[
"名字很长的X轴标签1",
"名字很长的X轴标签2",
"名字很长的X轴标签3",
"名字很长的X轴标签4",
"名字很长的X轴标签5",
"名字很长的X轴标签6",
]
)
.add_yaxis("商家A", [10, 20, 30, 40, 50, 40])
.add_yaxis("商家B", [20, 10, 40, 30, 40, 50])
.set_global_opts(
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
title_opts=opts.TitleOpts(title="Bar-旋转X轴标签", subtitle="解决标签名字过长的问题"),
)
.render(r"D:\CODE\testproject\test230228\可视化_柱状图\test_bar.html")
)
#反转xy轴:.reversal_axis(),此时在可在y轴数值处设置label在ti'y'c
时间线绘制
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType
# 读取数据
f = open(r"D:\CODE\testproject\test230301\1960-2019全球GDP数据.csv","r", encoding="GB2312")
data_lines = f.readlines() # read返回的字符串,readlines得到的是列表
f.close()
data_lines.pop(0) # 删除第一条没用的数据
# 将数据处理为字典,格式:
# {1960:[[美国,123][][],....],1961:....}
data_dict = {} # 定义一个字典对象
# 创建时间线对象,下面for循环时数据需要添加到timeline中
timeline = Timeline({"theme": ThemeType.LIGHT})
for line in data_lines: # 拿到每一行数据
year = int(line.split(",")[0])
country = line.split(",")[1]
gdp = float(line.split(",")[2]) # 利用float可以避免科学计数法带来的问题
# 如何判断字典里面有没有定义的key
try:
# 获取年份,如果year存在(比方说1960已经取过美国数据,现在要取1960中国数据,这样data_dict[year]不需要重复建立),追加填入country和gdp数据
data_dict[year].append([country, gdp])
except KeyError:
data_dict[year] = []
data_dict[year].append([country, gdp]) # 如果没有,就创建一个data_dict[year]
# print(data_dict) 看了一下,数据准备没问题
# 因为字典无序,主动排序年份
sorted_year_list = sorted(data_dict.keys())
# print(sorted_year_list) 看一下,年份正序排列
# 只取每年前十进行展示
for year in sorted_year_list:
# key=xxx是关键字传参(因为不是sort函数默认排第一个的变量),data_dict[year]数据是本年[['美国',123123123],['英国',123123123],....]形式的,用sort按照下标1(gdp数据)逆向排序
data_dict[year].sort(key=lambda element: element[1], reverse=True)
year_data = data_dict[year][0:10] # 取出本年份前十名的国家
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]) # y轴添加gdp
# 构建柱状图
bar = Bar()
x_data.reverse()
y_data.reverse() # 这两步,将前十的数据,x和y都进行调转,相比原本不调转时GDP高的图像显示在下方,等于是将GDP高的图像显示在上方
bar.add_xaxis(x_data)
bar.add_yaxis("GDP(亿)", y_data, label_opts=LabelOpts(
position="right")) # y轴名称,数据,设置数据在右(因为要反转xy轴)
bar.reversal_axis() # 反转xy轴
bar.set_global_opts(
title_opts=TitleOpts(title=f"{year}年全球GDP前十国家数据") # 设置标题,每年改变
)
# 将年份数据添加到timeline中
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(r"D:\CODE\testproject\test230301\1969-2019全球GDP前十国家.html")
第二阶段
Chap1面向对象
初识对象
程序中组织数据的方式类似于生活中的使用表格:
设计类class > 设计表格
创建对象 > 打印表格
对象属性赋值 > 填写表格
类的成员方法
类由哪两部分组成:
属性:成员变量
行为:成员方法
注意:函数是写在类外的,定义在类的内部,我们称之为方法
类和成员方法和定义语法:
class类名称:
成员变量
def成员方法(self, 参数列表):
成员方法体
对象 = 类名称()
self的作用
表示类对象本身的意思
只有通过self,成员方法才能访问类的成员变量
self出现在形参列表中,但是不占用参数位置,无需理会
类和对象
类和对象的关系:
类是程序中的“设计图纸”
对象是基于图纸生产的具体实体
什么是面向对象编程:使用对象进行编程,即设计一个类,基于类创建对象,并使用对象完成具体的工作
构造方法
构造方法的作用:
在创建类对象(构造类)的时候,会自动执行
在创建类对象(构造类)的时候,将传入参数自动传递给init方法使用
定义语法示例:
class Student:
def __init__(self, name, age, tel):
self.name = name
self.age = age
self.tel = tel#构造方法中使用成员变量,self.既有定义的功能,又有赋值的功能
print("Student类创建了一个类对象")
stu = Student("xiaoming",19,"119") #此时已经自动执行了一遍构造方法
print(stu.name)
print(stu.age)
print(stu.tel)
'''
结果:
Student类创建了一个类对象
xiaoming
'''
注意:
构造方法也是成员方法,参数列表中要提供self
在方法内使用成员变量需要使用self
示例:
'''
设计一个类,记录学生的姓名、年龄、地址
实现:
通过for循环,配合input语句,并使用构造方法,完成学生信息的键盘录入
输入完成后,使用print语句,完成信息的输出
'''
class Student:
def __init__(self, name, age, add):
for i in range(1, 11):
print(f"当前录入第{i}位学生信息,总共需录入10名同学信息")
self.name = input("请输入学生姓名:")
self.age = input("请输入学生年龄:")
self.add = input("请输入学生地址:")
print(f"学生{i}信息录入完成,信息为:【学生姓名:{self.name},年龄:{self.age},地址:{self.add}】")
stu = Student("", "", "")
魔术方法
是什么:python内置的一些类方法,有各自的功能(作用在类对象上)
功能:
示例:
str字符串方法:
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
#str魔术方法
def __str__(self):
returnf"Student类对象,name:{self.name},age:{self.age}"#自行控制Student类对象返回什么内容
stu = Student("xiaoming",19)
print(stu) #Student类对象,name:xiaoming,age:19
print(str(stu)) #Student类对象,name:xiaoming,age:19
lt小于符号比较:(小于 or 大于)
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
# lt魔术方法
def __lt__(self, other): #other
return self.age < other.age
stu1 = Student("xiaoming", 19)
stu2 = Student("xiaowang", 18)
print(stu1<stu2) #结果:Flase
print(stu2<stu1) #结果:True
le小于等于符号比较:(小于等于 or 大于等于)逻辑同上
eq比较运算符实现方法:(等于)
封装
面向对象编程:
基于类去创建对象,使用对象完成功能开发
面向对象三大主要特性:
封装
继承
多态
是什么:将现实世界事物的属性和行为,封装到类中,描述为成员变量和成员方法,从而完成程序对现实世界事物的描述
私有成员(包括成员变量和成员方法):均以两个下划线开头
无法被类对象使用:
# 定义一个类,内含私有成员变量和私有成员方法
class Phone:
__cunrrent_voltage = None # 私有成员变量
def __keep_single_core(self): # 私有成员变量
print("让CPU单核运行")
phone = Phone()
phone.__keep_single_core() #报错
print(phone.__cunrrent_voltage) #报错
可以被其他成员使用:
class Phone:
__current_voltage = 0.5
def __keep_single_core(self):
print("Keep single core")
def call_by_5g(self):
if self.__current_voltage >= 1:
print("Call by 5G")
else:
self.__keep_single_core()
print("电量不足,无法5g通话")
phone = Phone()
phone.call_by_5g()
#对voltage更改数值,可以触发call_by_5g的功能,说明私有成员可以被其他成员调用
示例:
'''
设计一个手机类,内部包含:
私有成员变量:__is_5g_enable,类型bool,True表示开启5g,False表示关闭5g
私有成员方法:__check_5g(),会判断私有成员__is_5g_enable的值
如果为True,打印输出:5g开启
如果为False,打印输出:5g关闭,使用4g
公开成员方法:call_by_5g(),调用它会执行:
调用私有成员方法:__check_5g(),判断5g网络状态
打印输出:正在通话中
'''
class Phone():
__is_5g_enable = False
def __check_5g(self):
if self.__is_5g_enable == True: #注意别漏掉self
print("5g开启")
else:
print("5g关闭,使用4g")
def call_by_5g(self):
self.__check_5g()
print("正在通话中")
phone = Phone()
phone.call_by_5g()
'''
结果:
5g关闭,使用4g
正在通话中
'''