Python数据可视化(三)

2024-08-02 19:05:39 浏览数 (1)

前言

在大数据时代,数据可视化成为了分析和展示数据的重要手段。在众多数据可视化形式中,柱状图以其直观性和易读性而广受欢迎。本章基于案例分析详细讲解了柱状图的不同类型,包括基础柱状图以及动态柱状图。


本篇文章参考:黑马程序员

一、基础柱状图

①基本流程

导入必要的模块: 创建柱状图对象

添加x轴数据 添加x轴数据 设置全局选项 渲染或生成图像

②常见方法

Method

Function

Example

add_xaxis()

设置 x 轴的数据

bar.add_xaxis(["A", "B", "C", "D"])

add_yaxis()

添加 y 轴的数据

bar.add_yaxis("系列名称", [10, 20, 30, 40])

set_global_opts()

设置全局配置选项

bar.set_global_opts(title_opts=opts.TitleOpts(title="图表标题"))

set_series_opts()

设置系列特定配置

bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True))

render()

渲染图表并保存为 HTML 文件

bar.render("chart.html")

set_colors()

设置图表中柱子的颜色

bar.set_colors(['#d48265', '#91c7ae'])

reversal_axis()

反转轴

bar.reversal_axis()

set_tooltip()

自定义 tooltip 的显示方式

bar.set_global_opts(tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}"))

set_legends()

自定义图例

bar.set_series_opts(label_opts=opts.LabelOpts(position="top"))

overlap()

将多个系列重叠显示

bar1.overlap(bar2)

datazoom()

添加数据缩放控件

bar.set_global_opts(datazoom_opts=[opts.DataZoomOpts()])

export_snapshot()

导出快照

bar.export_snapshot("snapshot.png")

绘制垂直柱状图:

代码语言:python代码运行次数:0复制
# 导包

from pyecharts.charts import Bar

# 使用Bar构建基础柱状图

bar=Bar()

# 添加x轴数据

bar.add_xaxis(["中国","美国","英国"])

# 添加y轴数据

bar.add_yaxis("GDP",["30","20","10"])

# 绘图

bar.render()

打开render.html文件,点击右上角的浏览器图标,可以在浏览器中查看创建的柱状图。

绘制水平柱状图:

通过reversal_axis()方法反转x轴和y轴。

代码语言:python代码运行次数:0复制
# 导包
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"))
# 反转x轴和y轴
bar.reversal_axis()
# 绘图
bar.render()

打开render.html文件,点击右上角的浏览器图标,可以在浏览器中查看创建的柱状图。

二、动态柱状图

①创建时间线

柱状图主要用于描述分类数据,回答的是每个分类中『有多少?』这个问题,这是柱状图的主要特点。但是柱状图很难动态地描述一个趋势性的数据,这里pyecharts为我们提供了一种解决方案——时间线

如果说一个Bar或者Line对象是一张图表的话,那时间线就是创建一个一维的x轴,轴上每一个点就是一个图表对象。通过时间线,我们能够直观地展示随时间变化的数据趋势,使得数据的变化和发展过程一目了然。

方法:

timeline = Timeline()

Timeline()常用语法:

Method

Function

Example

__init__()

初始化时间线对象

timeline = Timeline()

add()

向时间线添加图表

timeline.add(chart, time)

add_schema()

添加时间线的基本配置

timeline.add_schema(play_interval=1000)

set_global_opts()

设置全局选项

timeline.set_global_opts(title_opts=opts.TitleOpts(title="时间线示例"))

render()

渲染图表并保存为HTML文件

timeline.render("timeline.html")

set_series_opts()

设置系列图表的选项

timeline.set_series_opts(label_opts=opts.LabelOpts(is_show=True))

set_colors()

设置时间线的颜色

timeline.set_colors(["#ff0000", "#00ff00"])

set_tooltip()

设置工具提示

timeline.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger="axis"))

clear()

清空时间线中的所有图表

timeline.clear()

代码语言:python代码运行次数:0复制
# 导包
from pyecharts.charts import Bar,Timeline
from pyecharts.options import LabelOpts
# 使用Bar构建柱状图
bar1=Bar()
# 添加x轴数据
bar1.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
# 设置数值标签在右侧
bar1.add_yaxis("GDP",["30","20","10"],label_opts=LabelOpts(position="right"))
# 反转x轴和y轴
bar1.reversal_axis()

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

bar3=Bar()
bar3.add_xaxis(["中国","美国","英国"])
bar3.add_yaxis("GDP",["60","50","40"],label_opts=LabelOpts(position="right"))
bar3.reversal_axis()

# 构建时间线对象
timeline=Timeline()
# 在时间线对象内添加柱状图对象
timeline.add(bar1,"点1")
timeline.add(bar2,"点2")
timeline.add(bar3,"点3")

# 绘图(通过时间线对象绘图)
timeline.render()

打开render.html文件,点击右上角的浏览器图标,可以在浏览器中查看创建的柱状图。

点1对应的柱状图:

点2对应的柱状图:

点3对应的柱状图:

②自动播放

可通过add_schema()方法添加时间线的基本配置,如是否自动播放、是否循坏播放、是否显示时间线等 。

代码语言:python代码运行次数:0复制
# 导包
from pyecharts.charts import Bar,Timeline
from pyecharts.options import LabelOpts
# 使用Bar构建柱状图
bar1=Bar()
# 添加x轴数据
bar1.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
# 设置数值标签在右侧
bar1.add_yaxis("GDP",["30","20","10"],label_opts=LabelOpts(position="right"))
# 反转x轴和y轴
bar1.reversal_axis()

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

bar3=Bar()
bar3.add_xaxis(["中国","美国","英国"])
bar3.add_yaxis("GDP",["60","50","40"],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.render()

打开render.html文件,点击右上角的浏览器图标,可以在浏览器中查看创建的柱状图。每隔1000ms会轮换一张柱状图。

③时间线主题设置

在pyecharts中,我们可以通过主题设置来更改图表的外观。

基本语法:

timeline = Timeline({"theme": 时间线主题})

例如:

代码语言:python代码运行次数:0复制
# 构建时间线对象并进行主题设置
timeline = Timeline({"theme": ThemeType.LIGHT})

常用时间线主题:

代码语言:python代码运行次数:0复制
# 导包
from pyecharts.charts import Bar,Timeline
from pyecharts.options import LabelOpts
from pyecharts.globals import ThemeType
# 使用Bar构建柱状图
bar1=Bar()
# 添加x轴数据
bar1.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
# 设置数值标签在右侧
bar1.add_yaxis("GDP",["30","20","10"],label_opts=LabelOpts(position="right"))
# 反转x轴和y轴
bar1.reversal_axis()

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

bar3=Bar()
bar3.add_xaxis(["中国","美国","英国"])
bar3.add_yaxis("GDP",["60","50","40"],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.render()

打开render.html文件,点击右上角的浏览器图标,可以在浏览器中查看创建的柱状图。

三、案例分析

【案例——GDP动态柱状图】

1960-2019全球GDP数据.csv文本文件存储了2021年08月18日中国各省份疫情相关数据,请根据该数据绘制1960-2019年全球GDP排名前八的动态柱状图。

要求实现如下效果:

1.GDP数据处理为亿级

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

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

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

5.设置了主题为LIGHT

解题思路:

需求分析

处理数据

列表排序

准备时间线

自动播放和绘图

【知识补充】

在前面我们学习过sorted()函数,可以对数据容器进行排序。而在该案例中,我们需要对列表进行排序,并指定排序规则,但sorted()函数无法完成该任务。这时我们需要补充学习列表的sort()方法。

①基本语法

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

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

②书写方式

写法一:基于带名函数

代码语言:python代码运行次数:0复制
# 准备列表
my_list=[["a",33],["b",55],["c",11]]

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

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

输出结果:

['b', 55, 'a', 33, 'c', 11]

写法二:基于lambda函数

lambda函数相关知识点见 Python函数进阶这篇文章。

代码语言:python代码运行次数:0复制
# 准备列表
my_list=[["a",33],["b",55],["c",11]]

# 排序(基于lambda函数)
my_list.sort(key=lambda element:element[1],reverse=True)
print(my_list)

输出结果:

['b', 55, 'a', 33, 'c', 11]

例题代码:

代码语言:python代码运行次数:0复制
# 导包
from pyecharts.charts import Bar,Timeline
from pyecharts.options import LabelOpts,TitleOpts
from pyecharts.globals import ThemeType

# 读取数据
# GB2312是针对简体中文字符集的编码,适用于处理中文文本
f=open("D:/1960-2019全球GDP数据.csv","r",encoding="GB2312")
data_lines=f.readlines()
# 关闭文件
f.close()
# 删除第一条数据
data_lines.pop(0)
# 将数据转换为字典存储
# 格式为:{年份:[国家,gdp],[国家,gdp],……}
data_dict={}
for line in data_lines:
    year=int(line.split(",")[0])   #得到年份
    country=line.split(",")[1]   #得到国家
    # 通过float将科学计数法表示的GDP值转换为正常的浮点数
    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]))
# print(data_dict)   可以打印出来观察数据,方便理解
#输出数据:{1960: [['美国', 543000000000.0], ['英国', 73233967692.0],……],2019: [['美国', 21400000000000.0], ['中国', 14300000000000.0],……]}

# 排序年份
sorted_year_list=sorted(data_dict.keys())
# print(sorted_year_list)   可以打印出来观察数据,方便理解
#输出数据:[1960, 1961, 1962, ……]

# 创建时间线对象并设置主题
timeline=Timeline({"theme":ThemeType.LIGHT})

# 排序每个年份各国的GDP
for year in sorted_year_list:
    data_dict[year].sort(key=lambda element:element[1],reverse=True)
    # 取出本年份GDP前8名的国家
    year_data=data_dict[year][0:8]
    # print(year_data)   可以打印出来观察数据,方便理解
    """
    输出结果:
    [['美国', 543000000000.0], ['英国', 73233967692.0], ['法国', 62225478000.0], ['中国', 59716467625.0], ['日本', 44307342950.0], ['加拿大', 40461721692.0], ['意大利', 40385288344.0], ['印度', 37029883875.0]]
    [['美国', 563000000000.0], ['英国', 77741965703.0], ['法国', 67461644222.0], ['日本', 53508617739.0], ['中国', 50056868957.0], ['意大利', 44842760293.0], ['加拿大', 40934952063.0], ['印度', 39232435784.0]]
    [['美国', 605000000000.0], ['英国', 81247564156.0], ['法国', 75607529809.0], ['日本', 60723018683.0], ['意大利', 50383891898.0], ['中国', 47209359005.0], ['加拿大', 42227447631.0], ['印度', 42161481858.0]]
    [['美国', 639000000000.0], ['英国', 86561961812.0], ['法国', 84759195105.0], ['日本', 69498131797.0], ['意大利', 57710743059.0], ['中国', 50706799902.0], ['印度', 48421923458.0], ['加拿大', 45029988561.0]]
    ……
    """

    x_data=[]
    y_data=[]
    # for循坏每一年的数据,基于每一年的数据,创建每一年的bar对象
    for country_gdp in year_data:
        x_data.append(country_gdp[0])   # x轴添加国家
        y_data.append(country_gdp[1])   # 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"))
    # 反转x轴和y轴
    bar.reversal_axis()
    # 设置每一年的图标的标题
    bar.set_global_opts(
        title_opts=TitleOpts(title=f"{year}年全球排名前八GDP数据")
    )

    # 将每一年的bar对象添加到时间线中
    # str(year): 将年份转换为字符串,以确保它可以正确地与 bar 关联
    timeline.add(bar,str(year))

# 设置时间线自动播放
timeline.add_schema(
# 自动播放的时间间隔,单位为毫秒
    play_interval=1000,
    # 是否显示时间线
    is_timeline_show=True,
    # 是否自动播放
    is_auto_play=True,
    # 是否循坏播放
    is_loop_play=True
)
# 绘图
timeline.render()

打开render.html文件,点击右上角的浏览器图标,可以在浏览器中查看创建的柱状图。

0 人点赞