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

news2024/9/21 1:56:01

版本说明

当前版本号[20230729]。

版本修改说明
20230729初版

目录

文章目录

  • 版本说明
  • 目录
  • 知识总览图
  • Python基础综合案例——数据可视化 - 动态柱状图
    • 案例效果
    • 基础柱状图
      • 通过Bar构建基础柱状图
      • 反转x和y轴
      • 将数值标签放在右侧
    • 基础时间线柱状图
      • 创建时间线
      • 自动播放
      • 时间线设置主题
    • GDP动态柱状图绘制
      • 需求分析
      • 列表的sort方法
        • 带名函数形式
        • 匿名lambda形式
      • 处理数据
      • 准备时间线
      • 自动播放和绘图
      • 完整代码
      • 最终结果

知识总览图

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/811945.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于FPGA的VGG16卷积神经网络加速器--WL

VGG16是一个典型的卷积神经网络,由13层卷积层,5层池化层和3层全连接层组成。且卷积层的计算时间在整个计算过程中占比极大,通过FPGA的并行运算可以有效的加快卷积层的计算速度。 一个卷积层可以有若干个卷积核,以第一层为例&#…

NetSuite 工单超额完工

用户问题 在报工时,完工数量能否超过工单上的计划数量? 解决方法 在制造相关的参数中,有一个参数控制: ALLOW OVERAGE ON WORK ORDER TRANSACTIONS •Check On允许超出工单计划数量 •Check Off不允许超出工单计划数量 Demo 工单计划数量…

前缀和拆分

前缀和 前缀和:一段序列里的前n项和 给出n个数,在给出q次问询,每次问询给出L、R,快速求出每组数组中一段L至R区间的和 给出一段数组,每次问询为求出l到r区间的和 普通方法:L到R进行遍历,那么…

Python-ElasticSearch客户端的封装(聚合查询、统计查询、全量数据)

目录 ES Python客户端介绍封装代码测试代码参考 ES Python客户端介绍 官方提供了两个客户端elasticsearch、elasticsearch-dsl pip install elasticsearchpip install elasticsearch-dsl第二个是对第一个的封装,类似ORM操作数据库,可以.filter、.group…

EverEdit的一些特殊使用教学(持续更新)

项目场景: EverEdit的使用经常一问三不知 搜也搜不到 解决方案: 先去EverEdit在线帮助文档看一下(附链接) EverEdit在线帮助文档 1.快速排序 使用快捷键时:若是小键盘,请同时按住fn键(在最左下角的ctrl旁)

220. 存在重复元素 III

220. 存在重复元素 III 原题链接:完成情况:解题思路:TreeSetsequenceSet.ceilingjava中的红黑树 参考代码: 原题链接: 220. 存在重复元素 III https://leetcode.cn/problems/contains-duplicate-iii/description/ 完…

ER系列路由器多网段划分设置指南

ER系列路由器多网段划分设置指南 - TP-LINK 服务支持 TP-LINK ER系列路由器支持划分多网段,可以针对不同的LAN接口划分网段,即每一个或多个LAN接口对应一个网段;也可以通过一个LAN接口与支持划分802.1Q VLAN的交换机进行对接,实现…

幅度调制与角度调制

文章目录 前言一、调制简介1、调制定义2、调制目的3、调制的分类 二、幅度调制(线性调制)1、幅度调制的一般模型2、常规双边带调幅 AM①、AM 信号的产生②、AM 调制器的模型③、AM 波形和频谱④、AM 信号的特点⑤、AM 包络检波⑥、调幅系数 3、抑制载波双…

Kotlin~Facade

概念 又称门面模式,为复杂系统提供简单交互接口。 角色介绍 Facade:外观类,供客户端调用,将请求委派给响应的子系统。SubSystem:子系统,独立的子设备或子类 UML 代码实现 class Light(val name: Strin…

Oracle 19c 报ORA-704 ORA-01555故障处理---惜分飞

异常断电导致数据库无法启动,尝试对数据文件进行recover操作,报ORA-00283 ORA-00742 ORA-00312错误,由于redo写丢失无法正常应用 D:\check_db>sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on 星期日 7月 30 07:49:19 2023 Version 19.3.0.0.0 Copyrig…

msvcp120.dll丢失的解决方法?哪种解决方法比较推荐?

msvcp120.dll是Microsoft Visual C Redistributable软件包的一部分。它是用于支持运行使用Microsoft Visual C编写的应用程序的动态链接库文件。msvcp120.dll提供了许多C标准库函数和组件,包括输入/输出、字符串处理、数学运算、内存管理等功能。 当您运行某个依赖于…

C++初阶——缺省参数以及函数重载

1. 缺省参数 缺省参数的分类&#xff1a;全缺省&#xff0c;半缺省 缺省参数是声明或定义函数时为函数的参数指定一个缺省值 在调用该函数时&#xff0c;若没有指定实参则采用该形参的缺省值否则使用指定的实参 void Func(int a 0) {cout<<a<<endl; }int main(…

nest的核心概念

请求进来 --- 中间件 --- 守卫 --- 拦截器 --- 通道 --- 处理&#xff08;controller层&#xff09; --- 拦截器 --- 返回 Pipe &#xff1a; 就是实现 PipeTransform 接口的 transform 方法&#xff0c;它的返回值就是传给 handler 的值。 ---------------------------------…

【Python数据分析】Python常用内置函数(二)

&#x1f389;欢迎来到Python专栏~Python常用内置函数&#xff08;二&#xff09; ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文…

Go语言进阶 + 依赖管理

依赖配置 - version开始&#xff0c;就开始很难听懂了&#xff0c;需要结合很多课后配套资料查阅很多文档和网站....然而好像没有那么多时间&#xff0c;一天给3小时学Go真的顶天了.....还有算法和Linux的Mysql... 这几天学Go已经把算法给挤掉了.....下步要权衡一下&#xff0c…

C#实现数据库数据变化监测(sqlservermysql)

监测数据库表数据变化&#xff0c;可实现数据库同步&#xff08;一主一从&#xff08;双机备份&#xff09;&#xff0c;一主多从&#xff08;总部数据库&#xff0c;工厂1&#xff0c;工厂2&#xff0c;工厂数据合并到总部数据&#xff09;&#xff09; sqlserver 启用数据库…

【Linux】网络基础

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统网络编程 文章目录 一、协议初识和网络协议分层&#xff08;TCP/IP四层模型&#xff09;认识协议TCP/IP五层&#xff08;或四层&#xff09;模型 二、认识MAC地址和IP地址认识MAC地址认识IP地址认…

什么是ssm?如何使用ssm进行后端开发

目录 一、ssm概述1.1 定义1.2 持久层框架 (mybatis&&mybatisPlus)1.3 Web 层框架 springMVC1.4 spring框架 二、开发结构2.1 config介绍2.2 controller介绍2.3 dao介绍2.4 domain介绍2.5 exception介绍2.6 interceptor介绍2.7 service介绍 三、注解开发介绍3.1 常见的注…

从零开始学Flask: 3分钟用Python快速构建Web应用

文章目录 一、背景二、安装&基础使用1. 安装 Flask2. 创建 Flask 应用3. 路由解析4. 模板渲染5. 请求和响应处理 三、Demo项目实战 一、背景 什么是Flask&#xff1f;Flask 是一个轻量级的 Python Web 应用框架&#xff0c;因其简单易用、灵活性高等特点&#xff0c;可以帮…

Ribbon源码

学了feign源码之后感觉&#xff0c;这部分还是按运行流程分块学合适。核心组件什么的&#xff0c;当专业术语学妥了。序章&#xff1a;认识真正のRibbon 但只用认识一点点 之前我们学习Ribbon的简单使用时&#xff0c;都是集成了Eureka-client或者Feign等组件&#xff0c;甚至在…