Python-Python基础综合案例——数据可视化 - 动态柱状图

版本说明

当前版本号[20230729]。

版本修改说明
20230729初版

目录

知识总览图

image-20230729173732463

Python基础综合案例——数据可视化 - 动态柱状图

案例效果

通过pyechars可以实现数据的动态显示, 直观的感受1960~2019年全世界各国GDP的变化趋势

image-20230717162505462

基础柱状图

目标:1. 掌握构建一个基础的柱状图并能够反转x和y轴

通过Bar构建基础柱状图

参考代码如下:

#演示基础柱状图的开发
from pyecharts.charts import Bar#这个语句的作用是将Bar图表模块导入到当前代码中,以便后续在代码中使用该模块提供的功能和方法来生成柱状图。

#使用 Bar 构建基础柱状图
bar = Bar()

#添加x轴的数据
bar.add_xaxis(["中国", "美国", "英国"])

#添加y轴的数据
bar.add_yaxis("GDP", [30, 20, 10])

#绘图
bar.render("基础柱状图.html")

Q:关于为什么bar.add_xaxis(["中国", "美国", "英国"])中要加入 []呢?

​ 在代码 bar.add_xaxis(["中国", "美国", "英国"]) 中,[] 表示一个列表,用来存储多个元素。它是一个包含了三个字符串元素的列表。这个列表被作为参数传递给了 bar.add_xaxis() 方法,用于设置 X 轴的坐标轴值。

​ 具体来说,bar.add_xaxis() 方法用于设置柱状图(bar chart)的 X 轴的坐标轴值。这些坐标轴的值会显示在图表的 X 轴上,用来表示不同的数据类别或者类别标签。在这个例子中,["中国", "美国", "英国"] 会被用作柱状图的 X 轴坐标轴值,即图表会有三个柱状条,每个柱状条代表一个国家,国家的名称就是列表中的元素。

根据代码所生成的基础柱状图如下:

image-20230717163041804

反转x和y轴

bar.reversal_axis() 是一个用于翻转柱状图坐标轴的方法。

在柱状图中,通常情况下,x轴表示柱状条的类别或者离散数值,而y轴表示柱状条的值。默认情况下,柱状图的x轴在底部,y轴在左侧。

通过调用 bar.reversal_axis() 方法,可以将柱状图的坐标轴进行翻转,使得x轴在左侧,y轴在底部。这样可以改变柱状图的显示方向,使其更适合展示横向数据。

#演示基础柱状图的开发
from pyecharts.charts import Bar

#使用 Bar 构建基础柱状图
bar = Bar()

#添加x轴的数据
bar.add_xaxis(["中国", "美国", "英国"])

#添加y轴的数据
bar.add_yaxis("GDP", [30, 20, 10])

#反转xy轴
bar.reversal_axis()

#绘图
bar.render("基础柱状图.html")

根据代码所生成的基础柱状图如下:

image-20230717163709445

将数值标签放在右侧

label_opts 是一个用来设置标签选项(Label Options)的参数

position="right" 表示设置标签的位置为右侧。通过这个参数,可以将柱状图(bar chart)上的标签显示在柱状条的右侧。

#演示基础柱状图的开发
from pyecharts.charts import Bar
from pyecharts.options import LabelOpts

#使用 Bar 构建基础柱状图
bar = Bar()

#添加x轴的数据
bar.add_xaxis(["中国", "美国", "英国"])

#添加y轴的数据
bar.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(position="right"))

#反转xy轴
bar.reversal_axis()

#绘图
bar.render("基础柱状图.html")

根据代码所生成的基础柱状图如下:

image-20230717163939875

基础时间线柱状图

创建时间线

from pyecharts.charts import Bar, Timeline 的作用是将BarTimeline图表模块导入到当前代码中,以便后续在代码中使用这两个模块提供的功能和方法来生成柱状图和时间轴图

from pyecharts.options import LabelOpts 是导入了pyecharts包中的LabelOpts模块的语句。这个语句的作用是导入LabelOpts模块,以便在代码中使用该模块提供的选项设置标签的功能和方法。通过LabelOpts模块,可以设置标签的颜色、字体大小、位置等,从而自定义柱状图或其他图表上标签的显示效果。

#演示基础时间线柱状图的开发
from pyecharts.charts import Bar, Timeline
from pyecharts.options import LabelOpts

#使用 Bar 构建基础柱状图
bar1 = Bar()
bar1.add_xaxis(["中国", "美国", "英国"])
bar1.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(position="right"))
bar1.reversal_axis()

bar2 = Bar()
bar2.add_xaxis(["中国", "美国", "英国"])
bar2.add_yaxis("GDP", [130, 60, 80], label_opts=LabelOpts(position="right"))
bar2.reversal_axis()

bar3 = Bar()
bar3.add_xaxis(["中国", "美国", "英国"])
bar3.add_yaxis("GDP", [1230, 870, 999], label_opts=LabelOpts(position="right"))
bar3.reversal_axis()

#构建时间线对象
timeline = Timeline()

#在时间线内添加柱形图对象(其中 bar1 是柱形图的对象,而 点1 是这个对象在时间线上的命名)
timeline.add(bar1, "点1")
timeline.add(bar2, "点2")
timeline.add(bar3, "点3")

#绘图将使用timeline,而不再是bar
timeline.render("基础时间线柱状图.html")

如果说一个Bar、Line对象是一张图表的话,时间线就是创建一个一维的x轴,轴上每一个点就是一个图表对象

根据代码所生成的基础时间线柱状图如下:

image-20230717171558775

自动播放

#演示基础时间线柱状图的开发
from pyecharts.charts import Bar, Timeline
from pyecharts.options import LabelOpts

#使用 Bar 构建基础柱状图
bar1 = Bar()
bar1.add_xaxis(["中国", "美国", "英国"])
bar1.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(position="right"))
bar1.reversal_axis()

bar2 = Bar()
bar2.add_xaxis(["中国", "美国", "英国"])
bar2.add_yaxis("GDP", [130, 60, 80], label_opts=LabelOpts(position="right"))
bar2.reversal_axis()

bar3 = Bar()
bar3.add_xaxis(["中国", "美国", "英国"])
bar3.add_yaxis("GDP", [1230, 870, 999], label_opts=LabelOpts(position="right"))
bar3.reversal_axis()

#构建时间线对象
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,而不再是bar
timeline.render("基础时间线柱状图.html")

根据代码所生成的基础时间线柱状图如下:

image-20230717172350177

时间线设置主题

#演示基础时间线柱状图的开发
from pyecharts.charts import Bar, Timeline
from pyecharts.options import LabelOpts
from pyecharts.globals import ThemeType

#使用 Bar 构建基础柱状图
bar1 = Bar()
bar1.add_xaxis(["中国", "美国", "英国"])
bar1.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(position="right"))
bar1.reversal_axis()

bar2 = Bar()
bar2.add_xaxis(["中国", "美国", "英国"])
bar2.add_yaxis("GDP", [130, 60, 80], label_opts=LabelOpts(position="right"))
bar2.reversal_axis()

bar3 = Bar()
bar3.add_xaxis(["中国", "美国", "英国"])
bar3.add_yaxis("GDP", [1230, 870, 999], label_opts=LabelOpts(position="right"))
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  #是否循环播放
)

#绘图将使用timeline,而不再是bar
timeline.render("基础时间线柱状图.html")

根据代码所生成的基础时间线柱状图如下:

image-20230717172735145

而更多主题所对应的代码如下图:

image-20230717174136754

GDP动态柱状图绘制

需求分析

image-20230717174932750

​ 简单分析后,发现最终效果图中需要:

  1. GDP数据处理为亿级

  2. 有时间轴,按照年份为时间轴的点

  3. x轴和y轴反转,同时每一年的数据只要前8名国家

  4. 有标题,标题的年份会动态更改

  5. 设置了主题为LIGHT

列表的sort方法

在前面我们学习过sorted函数,可以对数据容器进行排序

在后面的数据处理中,我们需要对列表进行排序,并指定排序规则,sorted函数就无法完成了。

我们补充学习列表的sort方法。

使用方式:

列表.sort(key=选择排序依据的函数, reverse=True|False)
  • 参数key,是要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
  • 参数reverse,是否反转排序结果,True表示降序,False表示升序
带名函数形式

​ 定义了一个名为choose_sort_key的函数,它作为排序的键函数。这个函数传入一个子列表元素,在本例中即是每个子列表该函数会返回列表中的第二个元素,即索引为1的元素。也就是说,这里的排序会根据每个子列表中的第二个元素来进行排序

​ 然后,通过调用列表的sort()方法,将my_list按照指定的排序规则进行排序。在这里,使用了带有自定义排序键的选择排序,即根据子列表中的第二个元素进行排序。

​ 最后,打印输出排序后的my_list。

#准备列表
my_list = [["a", 33], ["b", 66], ["c", 99]]

#排序,基于带名函数
def choose_sort_key(element):
    return element[1]

my_list.sort(key=choose_sort_key,  reverse=True)
print(my_list)

根据代码所打印的my_list如下:

image-20230717175651184

匿名lambda形式

​ 使用sort()函数对my_list进行排序,排序的依据是子列表中的第二个元素(即整数数字)并使用reverse=True参数表示降序排列

#准备列表
my_list = [["a", 33], ["b", 66], ["c", 99]]

my_list.sort(key=lambda element: element[1],  reverse=True)
print(my_list)

处理数据

将数据转换为字典存储,格式为:

{ 年份: [ [国家, gdp], [国家,gdp], ...... ], 年份: [ [国家, gdp], [国家,gdp], ...... ], ...... }

​ 首先,代码尝试在data_dict字典中查找给定年份的键(year)。如果键存在,代码将使用append方法将包含国家和GDP数据的列表添加到该键对应的值列表中。

​ 如果未找到给定年份的键,则代码进入except块。在该块中,它首先创建一个空列表,并将该列表作为给定年份的键的值存储在data_dict字典中。然后,代码通过使用append方法将包含国家和GDP数据的列表添加到该值列表中。

​ 这样,无论给定年份的键是否已经存在,代码都可以将国家和GDP数据添加到data_dict字典中的正确位置。

try:
    data_dict[year].append([country, gdp])
except KeyError:
    data_dict[year] = []
    data_dict[year].append([country, gdp])

准备时间线


#将数据转换为字典存储,先定义一个字典对象
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])

#构建时间线对象
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)
    #取出本年的GDP前八名国家
    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数据

自动播放和绘图

timeline.add_schema(
    play_interval=1000,
    is_timeline_show=True,
    is_auto_play=True,
    is_loop_play=False
)

timeline.render("1960-2019全球GDP前八国家数据.html")
f.close()

完整代码

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

#读取数据
f = open("F:/1960-2019全球GDP数据.csv", "r", encoding="GB2312")
data_lines = f.readlines()
#删除第一条数据
data_lines.pop(0)
#关闭文件
f.close()
print(type(data_lines))

#将数据转换为字典存储,先定义一个字典对象
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])

#构建时间线对象
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)
    #取出本年的GDP前八名国家
    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"))
    #反转xy轴
    bar.reversal_axis()
    bar.set_global_opts(
        title_opts=TitleOpts(title=f"{year}年全球前八GDP数据")
    )

    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前八国家数据.html")
f.close()

最终结果

image-20230717205124014

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放下华子我只抽RuiKe5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值