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

一、基础柱状图

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

不同主题对应的颜色:

想了解更多柱状图的用法,请访问官网:DocumentDescriptionhttps://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轴的数据也要跟着反转后:

相关推荐
青 春 记 忆3 小时前
Dify Docker Compose 通用无损升级指南:从备份、双版本预演到切换与回滚
运维·人工智能·python·docker·容器
GlueNa2SiO33 小时前
03-Flask模板引擎Jinja2详解
笔记·python·flask
临沂GEO5 小时前
GEO搜索优化科普|正规地理位置流量运营入门指南
大数据·人工智能·python·流量运营
大模型码小白6 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
荷蒲7 小时前
【小白量化Qbuddy】利用AI学习中文Python
人工智能·python·学习
数据狐(Datafox)9 小时前
京东商品列表API技术解析与落地应用(含标准 JSON 示例)
java·大数据·前端·人工智能·python·数据分析·json
量化吞吐机9 小时前
2026年下半年手工交易规则走向量化表达,产品该先接住哪一步
人工智能·python
Metaphor6929 小时前
使用 Python 读取和删除 Excel 文件属性
python·excel
迷迭香yy10 小时前
Python构建转融券多空识别系统从接口到因子的全流程 IG50免费开源股票数据API接口
开发语言·python·开源
月光船幽幽11 小时前
真实即粗糙,光滑是伪造
人工智能·python