综合案例-数据可视化-柱状图

news/2024/9/19 7:10:37/ 标签: 信息可视化, python, 青少年编程

一、基础柱状图

我们绘制一个关于三种水果销售额的柱状图,X轴数据为三种水果的名称,用列表['苹果','香蕉','橘子']添加进去,Y轴数据为三种水果的销售额,用列表[50,70,60]添加进去。

步骤

  1. 导包
  2. 构建柱状图对象
  3. 添加X轴数据
  4. 生成地图

代码如下:

python">#导包
from pyecharts.charts import Bar
#构建柱状图对象
bar=Bar()
#添加X轴数据
bar.add_xaxis(['苹果','香蕉','橘子'])
#添加Y轴数据
bar.add_yaxis('销售额',[50,70,60])
#生成地图
bar.render('基础柱状图.html')

运行代码后,同文件目录下生成新文件“基础柱状图.html”,用Edge浏览器查看生成的图表。

如果我们想要反转x和y轴,并让数值标签位于右侧

python">#导包
from pyecharts.charts import Bar
from pyecharts.options import *
#构建柱状图对象
bar=Bar()
#添加X轴数据
bar.add_xaxis(['苹果','香蕉','橘子'])
#添加Y轴数据
bar.add_yaxis('销售额',[50,70,60],label_opts=LabelOpts(position='right'))#数值标签位于右侧
#反转X轴Y轴
bar.reversal_axis()
#生成地图
bar.render('基础柱状图.html')

生成的图表:

二、基础时间线柱状图

Timeline()-时间线: 柱状图描述的是分类数据,回答的是每一个分类中有多少这个问题。柱状图很难动态的描述一个趋势性的数据,pyecharts为我们提供了一种解决方案——时间线。

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

我们绘制一个表示3个月水果销售额的基础时间线柱状图:

python">#导包
from pyecharts.charts import Bar,Timeline
from pyecharts.options import *#构建1月水果销售额柱状图
bar1=Bar()
bar1.add_xaxis(['苹果','香蕉','橘子'])
bar1.add_yaxis('销售额',[50,70,60])
bar1.reversal_axis()#反转X轴Y轴#构建2月水果销售额柱状图
bar2=Bar()
bar2.add_xaxis(['苹果','香蕉','橘子'])
bar2.add_yaxis('销售额',[90,40,70])
bar2.reversal_axis()#反转X轴Y轴#构建3月水果销售额柱状图
bar3=Bar()
bar3.add_xaxis(['苹果','香蕉','橘子'])
bar3.add_yaxis('销售额',[30,50,80])
bar3.reversal_axis()#反转X轴Y轴#创建时间线对象
timeline=Timeline()#timeline对象添加bar柱状图
timeline.add(bar1,'1月水果销售额')
timeline.add(bar2,'2月水果销售额')
timeline.add(bar3,'3月水果销售额')#生成图表
timeline.render('基础时间线柱状图.html')

生成的图表:

除了手动点击时间线上的点来切换图表,我们还可以设置自动播放,设置主题(达到更美观的效果),代码如下:

python">#构建1月水果销售额柱状图
bar1=Bar()
bar1.add_xaxis(['苹果','香蕉','橘子'])
bar1.add_yaxis('销售额',[50,70,60])
bar1.reversal_axis()#反转X轴Y轴#构建2月水果销售额柱状图
bar2=Bar()
bar2.add_xaxis(['苹果','香蕉','橘子'])
bar2.add_yaxis('销售额',[90,40,70])
bar2.reversal_axis()#反转X轴Y轴#构建3月水果销售额柱状图
bar3=Bar()
bar3.add_xaxis(['苹果','香蕉','橘子'])
bar3.add_yaxis('销售额',[30,50,80])
bar3.reversal_axis()#反转X轴Y轴#创建时间线对象
timeline=Timeline({'theme':ThemeType.ROMANTIC} #设置主题
)#timeline对象添加bar柱状图
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')

 生成的图表会自动播放,视频形式更方便展示:ROMANTIC主题自动播放的基础时间线柱状图-CSDN直播ROMANTIC主题自动播放的基础时间线柱状图https://live.csdn.net/v/423471

不同主题对应的颜色:

想了解更多柱状图的用法,请访问官网:DocumentDescriptionicon-default.png?t=O83Ahttps://gallery.pyecharts.org/#/Bar/README

三、GDP动态柱状图

3.1列表排序

本节所用文件链接:
链接:https://pan.baidu.com/s/13ClaKEHF_Cu5wbuOqd4TTg?pwd=oz6z 
提取码:oz6z

文件 “ 1960-2019全球GDP数据.csv ” 内的数据如下图所示(建议使用Notepad++打开):

我们要把文件内的数据转化为柱状图,如下面的效果图所示:

简单分析后,发现效果图中的数据需要按照GDP排序,我们在对比总结各类数据容器时学习过sorted函数,sorted函数直接根据数据容器内的数据进行排序(回顾sorted函数:http://t.csdnimg.cn/wjtZK,3.4排序功能)。

但是当数据容器内数据比较复杂时(例如列表嵌套),就需要按照指定的数据排序,如本文件,需要在同一年份里,按照GDP排序(升序),图中只展现前8个国家的GDP,sorted函数不再适用。我们可以使用sort函数,语法如下:

列表.sort(key=选择排序依据的函数, reverse=True|False)

  • 参数key,是要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
  • 参数reverse,是否反转排序结果,True表示降序,False表示升序

基础示例:

python">#如下列嵌套列表,对外层列表进行排序,排序依据是内层列表的第二个元素(升序)
list1=[['苹果',30],['香蕉',60],['橘子',50]]
#定义排序规则
def choose_sort_key(element):return element[1]
#排序
list1.sort(key=choose_sort_key,reverse=True)
print(list1)

输出:

[['香蕉', 60], ['橘子', 50], ['苹果', 30]]

我们还可以使用 lambda匿名函数(回顾知识:http://t.csdnimg.cn/MRZnC,3.2 lambda匿名函数),写出更简洁的代码:

python">#如下列嵌套列表,对外层列表进行排序,排序依据是内层列表的第二个元素(升序)
list1=[['苹果',30],['香蕉',60],['橘子',50]]
#定义排序规则
def choose_sort_key(element):return element[1]
#排序
#list1.sort(key=choose_sort_key,reverse=True)
list1.sort(key=lambda element:element[1],reverse=True)
print(list1)

输出:

[['香蕉', 60], ['橘子', 50], ['苹果', 30]]

3.2处理数据并生成图表

我们要处理一下文件“ 1960-2019全球GDP数据.csv ”中的数据,数据是csv格式,在使用open函数读取文件时要注意,编码格式不再是最常见的“ UTF-8 ”,而是“ GB2312 ”,我们可以在Notepad++界面的右下角看到(“ 1960-2019全球GDP数据.csv ”用记事本打开其编码格式不清晰,建议使用Notepad++):

文件开头的标题行需要删去。

绘制图表的步骤如下:

  1. 读取数据文件。
  2. 利用for循环将数据转换为python字典。
  3. 在时间线上添加点(每年的GDP柱状图)。
  4. 设置自动播放,生成图表。

代码如下所示:

python">#导包
from pyecharts.charts import Bar,Timeline
from pyecharts.globals import ThemeType
from pyecharts.options import *#读取数据文件
f=open('E:/可视化案例数据/动态柱状图数据/1960-2019全球GDP数据.csv','r',encoding='GB2312')
lines=f.readlines() #按行获取文件内全部数据,返回一个列表,其中每一行的数据为一个元素
#删除文件第一行数据
lines.pop(0)
#将数据转换为python字典,格式:{年份:[[国家, gdp], [国家,gdp],......],年份: [[国家, gdp],[国家,gdp],......],......}
data_dict={}
for line in lines:  #lines是列表,每行数据为一个元素year=int(line.split(',')[0]) #每行数据为一个元素,比如‘1960,英国,73233967692’,需要切割,第一个是年份country=line.split(',')[1] #每行数据为一个元素,比如‘1960,英国,73233967692’,需要切割,第二个是国家名称gdp=float(line.split(',')[2]) #切割,第三个是GDP,GDP是数字,此处float用来避免科学计数法数据格式,保留数据原样try:   #用异常处理控制字典新增元素,详解见代码下方data_dict[year].append((country,gdp)) #在对应的年份后追加元素[国家,gdp]except KeyError:data_dict[year]=[] #字典新增元素 year:列表data_dict[year].append((country, gdp))
#准备时间线
sorted_year_list=sorted(data_dict.keys())#对年份进行排序,从1960年开始,默认升序
#创建时间线对象并设置主题
timeline=Timeline({'theme':ThemeType.LIGHT})
#timeline对象添加bar柱状图
for year in sorted_year_list:data_dict[year].sort(key=lambda element:element[1],reverse=True)#每个年份内的“国家+GDP”数据按GDP排序(升序)year_data=data_dict[year][0:8] #排完序后取最高的前8位国家countrys=[] #用来保存X轴数据gdps=[]     #用来保存Y轴数据for country_gdp in year_data:countrys.append(country_gdp[0])gdps.append(int(country_gdp[1]/100000000))   #GDP单位为亿#创建柱状图对象bar=Bar()countrys.reverse() #详解见代码下方gdps.reverse()     #详解见代码下方#设置标题bar.set_global_opts(title_opts=TitleOpts(title=f'{year}年全球前8的GDP国际'))#添加X轴数据bar.add_xaxis(countrys)#添加Y轴数据bar.add_yaxis('GDP(亿)',gdps,label_opts=LabelOpts(position='right'))#标签在右侧#反转X轴和Y轴bar.reversal_axis() #得到横向的柱状图#timeline对象添加bar柱状图,即在时间线上添加点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('GDP动态柱状图.html')

第二步中需要注意:

  • 将数据转换为python字典,格式:{年份:[[国家, gdp],[国家,gdp],......],年份::[[国家,gdp],[国家,gdp],......],......},即年份为keyvalue内包含这一年所有国家的名称和GDP,value是列表类型,列表的元素类型为列表(嵌套),每个列表的内容:每个国家名称+对应的GDP。
  • 一个年份key对应的value内是所有国家的名称和GDP的列表,在字典data_dict中追加元素时,每次追加一个元素[国家,gdp],我们需要判断这个年份是否已经存在,即添加这个年份的数据是否是第一次添加,因为年份“一年”才能添加一次,如果此次都添加年份,数据格式就会混乱。这个年份如果存在,直接追加元素[国家,gdp],如果不存在,先追加年份这个key,再去追加对应的value中的元素[国家,gdp]。

第三步中需要注意:

因为我们要得到横向的柱状图,且保持GDP高的国家在上方,原本的X轴,Y轴反转后,X轴,Y轴的数据也要跟着反转,如下例所示:

X轴,Y轴的数据也要跟着反转后:


http://www.ppmy.cn/news/1527031.html

相关文章

C++ Primer Plus(速记版)-容器和算法

第九章 顺序容器 容器是存储特定类型对象的集合,标准库提供了多种容器类型以支持不同的使用场景。其中,顺序容器(如vector、list、deque)根据元素添加到容器中的顺序来存储和访问元素,与元素值无关。 这些顺序容器各有…

C++:析构函数

在销毁对象时,系统也会自动调用一个函数,它就是析构函数。析构函数没有返回值,它的函数名是在类名前加一个 ~ 符号。析构函数没有参数,不能被重载,这也就意味着析构函数只有一个,若没有写虚构函数&#xff…

CSS 响应式设计(补充)——WEB开发系列36

随着移动设备的普及,网页设计的焦点逐渐转向了响应式设计。响应式设计不仅要求网页在各种屏幕尺寸上良好展示,还要适应不同设备的特性。 一、响应式设计之前的灵活布局 在响应式设计流行之前,网页布局通常是固定的或流动的。固定布局使用固定…

鸡蛋检测系统源码分享

鸡蛋检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

MySQL中几种常见的行格式

在MySQL中,ROW_FORMAT 是用来指定表中行的存储格式的属性。不同的行格式会影响数据的存储方式,进而影响存储空间的使用效率和访问性能。ROW_FORMATCOMPACT 是其中一种行格式,表示“紧凑格式”。 以下是MySQL中几种常见的行格式: …

数据分析中:相关系数计算方法怎么选择合适?

选择合适的相关系数计算方法可以考虑以下几个方面: 一、数据类型 连续变量与连续变量: 皮尔逊相关系数:当两个连续变量之间呈线性关系,且数据满足正态分布假设时,皮尔逊相关系数是一个很好的选择。它衡量的是两个变量…

.NET 6.0 + WPF 使用 Prism 框架实现导航

合集 - .NET 基础知识(3) 1..NET 9 优化,抢先体验 C# 13 新特性08-202.《黑神话:悟空》神话再现,虚幻引擎与Unity/C#谁更强?08-21 3..NET 6.0 WPF 使用 Prism 框架实现导航09-11 收起 阅读目录 前言什么是Prism?安装 Prism使…

每日奇难怪题(持续更新)

1.以下程序输出结果是() int main() {int a 1, b 2, c 2, t;while (a < b < c) {t a;a b;b t;c--;}printf("%d %d %d", a, b, c); } 解析:a1 b2 c2 a<b 成立 ,等于一个真值1 1<2 执行循环体 t被赋值为1 a被赋值2 b赋值1 c-- c变成1 a<b 不成立…

物流系统中的嵌入式:STM32微控制器与智能算法驱动的物理循迹小车详细流程

一、项目概述 本项目旨在开发一款基于STM32微控制器的物理循迹小车&#xff0c;具备二维码识别能力&#xff0c;并能够将物品送到指定的物流位置。通过传感器和算法的结合&#xff0c;小车将实现自主导航和路径规划&#xff0c;从而提高物流效率和准确性。项目的目标是为智能物…

es6中set和map的区别

在ES6&#xff08;ECMAScript 2015&#xff09;中&#xff0c;Set 和 Map 是两种新的集合类型&#xff0c;它们提供了更高级的数据结构来存储唯一值或键值对集合。尽管它们在功能上有些相似&#xff0c;但它们在用途和内部机制上存在一些关键区别。 1. 基本概念 Set&#xff1…

前端框架大观:探索现代Web开发的基石

目录 引言 一、前端框架概述 二、主流前端框架介绍 2.1 React 2.1.1 简介 2.1.2 特点 2.1.3 代码示例 2.2 Vue.js 2.2.1 简介 2.2.2 特点 2.2.3 代码示例 2.3 Angular 2.3.1 简介 2.3.2 特点 2.3.3 代码示例 三、其他前端框架与库 四、前端框架的选择 五、结…

python install 出现443原因

解决办法&#xff1a; pycharm pycharm安装模块时一直提示443 超时问题_pytorch 443-CSDN博客 windows全局 Python代理模式下 解决 pip 安装第三方包时因 SSL 报错Caused by SSLError

Zookeeper工作机制、特点、数据结构、应用场景、配置参数解读

ZK工作机制 从涉及模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;负责存储和管理大家都关心的数据&#xff0c;然后接受观察者的注册&#xff0c;一旦这些数据的状态发生变化&#xff0c;zk就负责通知已在zk上注册的那些观察者做出相应…

【leetcode】树形结构习题

二叉树的前序遍历 返回结果&#xff1a;[‘1’, ‘2’, ‘4’, ‘5’, ‘3’, ‘6’, ‘7’] 144.二叉树的前序遍历 - 迭代算法 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,…

人工智能物联网:一项综述

这篇论文的标题是《Artificial Intelligence of Things: A Survey》&#xff0c;作者是 Shakhrul Iman Siam 等人&#xff0c;来自不同的大学和研究机构。论文提供了对人工智能物联网&#xff08;AIoT&#xff09;研究的系统性和全面性回顾。以下是论文的主要内容概述&#xff…

【C#生态园】提高C#开发效率和代码质量的利器:ORM库和数据库连接库

探秘C#数据库利器&#xff1a;全面解读6大库功能与用法 前言 在现代软件开发中&#xff0c;使用合适的库可以极大地提高开发效率和代码质量。针对不同的数据库操作需求&#xff0c;C#开发者常常会选择不同的ORM库和数据库连接库来满足其需求。本文将介绍一些用于C#的主流ORM库…

Win11+Ubuntu20.04双系统安装教程(避坑版)

Win11Ubuntu20.04双系统安装教程&#xff08;避坑版&#xff09; 前言系统盘制作安装Rufus系统盘制作 Windows磁盘配置移动分区&#xff08;磁盘分区时出现不连续的未分配空间需要用到&#xff0c;如果是连续的未分配空间即无需操作&#xff09;安装分区助手移动分区 安装Ubunt…

adb devices不显示连接设备怎么解决

adb devices不显示设备&#xff0c;首先用老办法检查。假如是显示adb这个命令不认识&#xff0c;那就是系统路径问题。假如能认识adb这个命令&#xff0c;那就检查一下手机有没有开usb调试。 但是我遇到了更奇怪的问题&#xff1a;我把网上的攻略都试了一遍&#xff0c;设备驱…

SVM——支持向量机的学习入门

1、推荐文章 1、一文看懂SVM算法 2、图解机器学习|支持向量机模型详解 3、支持向量机的直观理解 2、分类问题 假设你的大学开设了一门机器学习&#xff08;ML&#xff09;课程。课程导师发现数学或统计学好的学生表现最佳。随着时间的推移&#xff0c;积累了一些数据&…

SAP系统使用BRTOOLS的系统COPY

SAP系统使用BRTOOLS的系统COPY 今天偶然翻到的,这个是在之前的公司自己兼职basis摸索的,速度比较快,比标准的system copy好用很多。使用的是SAP系统的BRTOOLS,每次都是成功的,那个NAS有的就是LINUX的一些基本操作,基本都是一样的。 1、ERPRD1服务器使用DB13每天备份到指…