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

news/2024/12/22 11:01:29/

一、基础柱状图

我们绘制一个关于三种水果销售额的柱状图,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 不成立…