实现思路
-
数据准备:首先需要有数据源,本例中为CSV文件,包含了1960-2019年全球GDP数据。
-
数据集链接:https://pan.quark.cn/s/88cf257eba13
-
数据读取与处理:使用Python的文件操作读取CSV文件,并将数据转换为字典格式,便于后续处理。
-
创建时间线:使用pyecharts的
Timeline
对象来管理多个时间点的数据,实现动态展示。 -
构建柱状图:对于每个时间点,创建一个
Bar
对象,添加x轴和y轴数据,并设置标签显示位置。 -
排序与筛选:对每个年份的数据进行排序,并筛选出前8名国家的数据。
-
反转坐标轴:通过
reversal_axis
方法反转x轴和y轴,以适应数据展示需求。 -
设置图表选项:为每个柱状图设置全局选项,如标题等。
-
添加到时间线:将每个年份的柱状图添加到时间线对象中。
-
设置时间线选项:配置时间线的行为,如自动播放、循环播放等。
-
渲染图表:最后将时间线对象渲染为HTML文件,供浏览器展示。
代码解释
Bar()
:创建柱状图对象。add_xaxis()
和add_yaxis()
:向柱状图中添加x轴和y轴的数据。reversal_axis()
:反转柱状图的x轴和y轴。LabelOpts(position="right")
:设置数值标签显示在右侧。Timeline()
:创建时间线对象,用于动态展示不同时间点的数据。sorted()
:对字典的键进行排序,以便按年份顺序处理数据。sort(key=lambda element: element[1], reverse=True)
:对列表进行排序,根据元素的第二个值(GDP)降序排列。set_global_opts()
:设置全局配置选项,如标题等。render()
:将图表渲染为HTML文件。
Python中语法难点的解释扩展
-
字典推导与异常处理:在构建
data_dict
时,使用try...except
结构来处理可能的KeyError
,即在字典中添加新键时如果键不存在则创建它。try: data_dict[year].append([country, gdp]) except KeyError: data_dict[year] = [] data_dict[year].append([country, gdp])
-
lambda表达式:在排序时使用
lambda
表达式来指定排序的依据,这里根据GDP值进行排序。data_dict[year].sort(key=lambda element: element[1], reverse=True)
-
列表切片:使用列表切片来获取排序后的前8个国家的数据。
year_data = data_dict[year][0:8]
-
文件操作:使用
open()
函数打开文件,并使用readlines()
读取所有行,最后使用close()
关闭文件。f = open("path_to_file", "r", encoding="GB2312") data_lines = f.readlines() f.close()
-
列表反转:在添加数据到柱状图之前,使用列表的
reverse()
方法反转x轴数据,以适应图表展示。x_data.reverse() y_data.reverse()
-
动态图表渲染:通过
Timeline
对象的add()
方法动态地将多个图表添加到时间线中,并使用render()
方法将整个时间线渲染为HTML文件。timeline.add(bar, str(year)) timeline.render("output_file.html")
总代码
# 1. 通过Bar()构建一个柱状图对象
# 2. 和折线图一样,通过add_xaxis()和add_yaxis()添加x和y轴数据
# 3. 通过柱状图对象的:reversal_axis(),反转x和y轴
# 4. 通过label_opts=LabelOpts(position="right")设置数值标签在右侧显示
# 创建时间线
# Timeline()-时间线
# 柱状图描述的是分类数据,回答的是每一个分类中『有多少?』这个问题. 这是柱状图的主要特点,同时柱状图很难动态的描述一个趋势性的数据. 这里pyecharts为我们提供了一种解决方案-时间线
# 如果说一个Bar、Line对象是一张图表的话,时间线就是创建一个
# 一维的x轴,轴上每一个点就是一个图表对象
# 列表的sort方法
# 在前面我们学习过sorted函数,可以对数据容器进行排序。
# 在后面的数据处理中,我们需要对列表进行排序,并指定排序规则,sorted函数就无法完成了。
# 我们补充学习列表的sort方法。
# 使用方式:
# 列表.sort(key=选择排序依据的函数, reverse=True|False)
# 参数key,是要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
# 参数reverse,是否反转排序结果,True表示降序,False表示升序
"""
演示第三个图表:GDP动态柱状图开发
"""
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType
# 读取数据
f = open("GDP动态柱状图数据集.csv", "r", encoding="GB2312")
data_lines = f.readlines()
# 关闭文件
f.close()
# 删除第一条数据
data_lines.pop(0)
# 将数据转换为字典存储,格式为:
# { 年份: [ [国家, gdp], [国家,gdp], ...... ], 年份: [ [国家, gdp], [国家,gdp], ...... ], ...... }
# { 1960: [ [美国, 123], [中国,321], ...... ], 1961: [ [美国, 123], [中国,321], ...... ], ...... }
# 先定义一个字典对象
data_dict = {}
for line in data_lines:
year = int(line.split(",")[0]) # 年份
country = line.split(",")[1] # 国家
gdp = float(line.split(",")[2]) # gdp数据
# 如何判断字典里面有没有指定的key呢?
try:
data_dict[year].append([country, gdp])
except KeyError:
data_dict[year] = []
data_dict[year].append([country, gdp])
# print(data_dict[1960])
# 创建时间线对象
timeline = Timeline({"theme": ThemeType.LIGHT})
# 排序年份
sorted_year_list = sorted(data_dict.keys())
for year in sorted_year_list:
data_dict[year].sort(key=lambda element: element[1], reverse=True)
# 取出本年份前8名的国家
year_data = data_dict[year][0:8]
x_data = []
y_data = []
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_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))
# for循环每一年的数据,基于每一年的数据,创建每一年的bar对象
# 在for中,将每一年的bar对象添加到时间线中
# 设置时间线自动播放
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")
HTML
HTML,全称为HyperText Markup Language(超文本标记语言),是一种用于创建网页和网页应用的标准标记语言。HTML文件由一系列的标签(tags)组成,这些标签定义了网页的结构和内容。
HTML文件的基本结构
一个基本的HTML文件通常包括以下几个部分:
-
文档类型声明(Document Type Declaration, DOCTYPE):告诉浏览器这个文件是HTML5文档。
<!DOCTYPE html>
-
HTML元素:是页面的主要容器。
<html> <head> </head> <body> </body> </html>
-
头部(
<head>
):包含了文档的元数据,比如文档的标题(<title>
)和链接到CSS样式表或JavaScript文件的链接。<head> <title>页面标题</title> </head>
-
主体(
<body>
):包含了网页的所有内容,比如文本、图片、链接、列表等。<body> <p>这是一个段落。</p> </body>
HTML标签
- 开始标签:比如
<p>
,表示一个元素的开始。 - 结束标签:比如
</p>
,表示一个元素的结束。 - 属性:提供有关HTML元素的额外信息,比如
<img src="image.jpg">
中的src
属性指定了图片的来源。
HTML元素类型
- 块级元素(Block-level elements):通常用于较大结构的布局,比如
<div>
,<p>
,<h1>
-<h6>
等。 - 内联元素(Inline elements):用于行内布局,比如
<span>
,<a>
,<img>
等。
网页渲染过程
当浏览器加载一个HTML文件时,它会解析文件中的HTML标签,并根据这些标签构建一个DOM(Document Object Model)树。DOM树是一个文档的编程接口,它将文档表示为一个节点树,每个节点代表一个HTML元素。然后浏览器会使用CSS样式和JavaScript脚本进一步渲染页面,最终呈现给用户。
HTML与其他技术的关系
- CSS(Cascading Style Sheets):用于设置HTML元素的样式和布局。
- JavaScript:一种脚本语言,用于增加网页的交互性。
HTML是构建网页的基础,而CSS和JavaScript则用于增强网页的外观和功能。