探索数据之美:初步学习 Python 柱状图绘制

news2024/11/24 0:17:29

文章目录

  • 一 基础柱状图
    • 1.1 创建简单柱状图
    • 1.2 反转x和y轴
    • 1.3 数值标签在右侧
    • 1.4 演示结果
  • 二 基础时间线柱状图
    • 2.1 创建时间线
    • 2.2 时间线主题设置取值表
    • 2.3 演示结果
  • 三 GDP动态柱状图绘制
    • 3.1 需求分析
    • 3.2 数据文件内容
    • 3.3 列表排序方法
    • 3.4 参考代码
    • 3.5 运行结果

一 基础柱状图

1.1 创建简单柱状图

  • pyecharts 是一个基于 Echarts 的 Python 图表库,它提供了丰富的图表类型和交互功能。可以使用使用 pyecharts 创建柱状图

首先,安装 pyecharts 库。如果没有安装,可以使用以下命令安装:

pip install pyecharts

然后,创建一个简单的柱状图:

from pyecharts import options as opts
from pyecharts.charts import Bar

# 示例数据
categories = ['Category A', 'Category B', 'Category C', 'Category D']
values = [25, 40, 30, 50]

# 创建柱状图实例
bar_chart = Bar()

# 添加数据
bar_chart.add_xaxis(categories)
bar_chart.add_yaxis("Values", values)

# 设置标题和标签
bar_chart.set_global_opts(title_opts=opts.TitleOpts(title="Basic Bar Chart"),
                          xaxis_opts=opts.AxisOpts(name="Categories"),
                          yaxis_opts=opts.AxisOpts(name="Values"))

# 渲染图表
bar_chart.render("basic_bar_chart.html")
  • 在这个示例中,首先导入 pyecharts 的必要模块。然后,创建一个 Bar 实例,代表柱状图。接着,使用 add_xaxisadd_yaxis 方法分别添加 x 轴和 y 轴的数据。还使用 set_global_opts 方法设置了标题和轴标签的选项。最后,使用 render 方法将图表渲染为 HTML 文件。

在这里插入图片描述

1.2 反转x和y轴

  • 可以使用pyecharts 的 Bar 类中的 reversal_axis() 方法翻转 x 轴和 y 轴
from pyecharts import options as opts
from pyecharts.charts import Bar

# 示例数据
categories = ['Category A', 'Category B', 'Category C', 'Category D']
values = [25, 40, 30, 50]

# 创建柱状图实例
bar_chart = Bar()

# 添加数据
bar_chart.add_xaxis(categories)
bar_chart.add_yaxis("Values", values)

# 设置标题和标签
bar_chart.set_global_opts(title_opts=opts.TitleOpts(title="Basic Bar Chart"),
                          xaxis_opts=opts.AxisOpts(name="Categories"),
                          yaxis_opts=opts.AxisOpts(name="Values"))
# 反转x和y轴
bar_chart.reversal_axis()

# 渲染图表
bar_chart.render("basic_bar_chart.html")

在这里插入图片描述

1.3 数值标签在右侧

  • 通过label_opts=LabelOpts(position=“right”)设置数值标签在右侧显示
from pyecharts import options as opts
from pyecharts.charts import Bar

# 示例数据
categories = ['Category A', 'Category B', 'Category C', 'Category D']
values = [25, 40, 30, 50]

# 创建柱状图实例
bar_chart = Bar()

# 添加数据
bar_chart.add_xaxis(categories)
bar_chart.add_yaxis("Values", values, label_opts=opts.LabelOpts(position="right"))

# 设置标题和标签
bar_chart.set_global_opts(title_opts=opts.TitleOpts(title="Basic Bar Chart"),
                          xaxis_opts=opts.AxisOpts(name="Categories"),
                          yaxis_opts=opts.AxisOpts(name="Values"))
# 反转x和y轴
bar_chart.reversal_axis()

# 渲染图表
bar_chart.render("basic_bar_chart.html")

1.4 演示结果

在这里插入图片描述

二 基础时间线柱状图

2.1 创建时间线

  • Timeline()-时间线
  • 柱状图的主要特点,:状图描述的是分类数据,回答的是每一个分类中有多少的问题。同时柱状图很难动态的描述一个趋势性的数据. 这里pyecharts为我们提供了一种解决方案-时间线
  • 如果说一个Bar、Line对象是一张图表的话,时间线就是创建一个一维的x轴,轴上每一个点就是一个图表对象
from pyecharts.charts import Bar, Timeline
from pyecharts.options import LabelOpts
from pyecharts.globals import ThemeType

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

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

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

# 构建时间线对象
# timeline = Timeline()
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  # 是否循环播放
)

# 绘图是用时间线对象绘图,而不是bar对象了
timeline.render("基础时间线柱状图.html")

2.2 时间线主题设置取值表

在这里插入图片描述

2.3 演示结果

在这里插入图片描述

三 GDP动态柱状图绘制

3.1 需求分析

在这里插入图片描述
简单分析后,发现最终效果图中需要:

  1. GDP数据处理为亿级
  2. 有时间轴,按照年份为时间轴的点
  3. x轴和y轴反转,同时每一年的数据只要前8名国家
  4. 有标题,标题的年份会动态更改
  5. 设置了主题为LIGHT

3.2 数据文件内容

year,GDP,rate
1960,美国,5.433E+11
1960,英国,73233967692
1960,法国,62225478000
1960,中国,59716467625
1960,日本,44307342950
1960,加拿大,40461721692

3.3 列表排序方法

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

  • 参数key,是要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
  • 参数reverse,是否反转排序结果,True表示降序,False表示升序
my_list = [["a", 33], ["b", 55], ["c", 11]]

# 排序,基于带名函数
# def choose_sort_key(element):
#     return element[1]
#
# my_list.sort(key=choose_sort_key, reverse=False)

# 使用 sort() 方法,按子列表中的第二个元素排序
my_list.sort(key=lambda x: x[1])

print("升序排序:", my_list)
# 升序排序: [['c', 11], ['a', 33], ['b', 55]]

my_list.sort(key=lambda x: x[1], reverse=True)

print("降序排序:", my_list)
# 降序排序: [['b', 55], ['a', 33], ['c', 11]]

  • key=lambda x: x[1]Lambda 表达式是一个用于比较排序的函数,它告诉 sort() 方法按照子列表中的第二个元素进行排序

3.4 参考代码

from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType

# 读取数据
f = open("c:/1960-2019全球GDP数据.csv", "r", encoding="GB2312")
data_lines = f.readlines()
# 关闭文件
f.close()

# 删除第一条数据
data_lines.pop(0) # year,GDP,rate

# 将数据转换为字典存储,格式为:
# { 年份: [ [国家, gdp], [国家,gdp], ......  ], 年份: [ [国家, gdp], [国家,gdp], ......  ], ...... }
# { 1960: [ [美国, 123], [中国,321], ......  ], 1961: [ [美国, 123], [中国,321], ......  ], ...... }
# 先定义一个字典对象
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)
    # 取出本年份前8名的国家
    year_data = data_dict[year][0:8]
    x_data = [] #countrys
    y_data = [] #gdps 
    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() # 反转国家,使GDP最高的排在最上面
	y_data.reverse() # 同步反转GDP数据
	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}年全球前8GDP数据")
	)
	timeline.add(bar, str(year)) #时间线添加一个点,和对应的bar图


# for循环每一年的数据,基于每一年的数据,创建每一年的bar对象
# 在for中,将每一年的bar对象添加到时间线中

# 设置自动播放
timeline.add_schema(
    play_interval=1000,
    is_timeline_show=True,
    is_auto_play=True,
    is_loop_play=False
)

# 绘图
timeline.render("1960-2019全球GDP前8国家.html")

3.5 运行结果

在这里插入图片描述

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

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

相关文章

libheif—— 1、Vs2017搭建libheif开发环境

HEIF(高效图像文件格式) 一种图片有损压缩格式,它的后缀名通常为".heic"或".heif"。 HEIF 是由运动图像专家组 (MPEG) 标准化的视觉媒体容器格式,用于存储和共享图像和图像序列。它基于…

第二章:CSS基础进阶-part1:CSS高级选择器

文章目录 一、 组合选择器二、属性选择器三、伪类选择器1、动态伪类选择器2、状态伪类选择器3、结构性伪类选择器4、否定伪类选择器 一、 组合选择器 后代选择器:E F子元素选择器: E>F相邻兄弟选择器:EF群组选择器:多个选择器…

模板的进阶

目录 1.非类型模板参数 2.模板特化 2.1概念 2.2函数模板特化 2.3类模板特化 2.3.1全特化 2.3.2偏特化 3.模板分离编译 3.1什么是分离编译 3.2 模板的分离编译 3.3解决方法 4. 模板总结 1.非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a…

smtplib.SMTPHeloError: (500, b‘Error: bad syntax‘)

如果你编写邮件收发工具的时候,有可能会遇到这个问题。这里直接给出解决办法。 目录 1、检查系统版本 2、点击右侧的更改适配器选项

Nginx负载均衡(重点)

正向代理 部署正向代理 server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; proxy_pass http://20.0.0.60:80…

【雕爷学编程】Arduino动手做(05)---热敏电阻传感器模块之热电效应的原理以及相关应用

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…

SD-MTSP:光谱优化算法LSO求解单仓库多旅行商问题MATLAB(可更改数据集,旅行商的数量和起点)

一、光谱优化算法LSO 光谱优化算法(Light Spectrum Optimizer,LSO)由Mohamed Abdel-Basset等人于2022年提出。 参考文献: [1]Abdel-Basset M, Mohamed R, Sallam KM, Chakrabortty RK. Light Spectrum Optimizer: A Novel Physi…

list的使用和模拟实现

目录 1.list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 2.为什么使用迭代器? 3.list的模拟实现 3.1完整代码 3.2代码解析 4.list与…

MySQL索引优化分析

MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字段的意义。助你…

Servlet介绍

1.简介 Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。 使用Servlet就可以实现,根据不同的登录用户在页面上动态显示不同内容。 Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类…

C++小游戏贪吃蛇源码

graphics.h是针对DOS下的一个C语言图形库 (c也可以) 目前支持下载此头文件的常用的有两种: 1. EGE (Easy Graphics Engine)2. EasyX Graphics LibraryEGE, 全名Easy Graphics Engine, 是windows下的简易绘图库,是一个类似BGI(graphics.h)的面向C/C语言新手的图形库…

win10+Vmware+ubuntu18 mosquitto调试记录

记录一下在建立mqtt调试环境上遇到的问题及对策。 我的PC环境为,win10为办公环境,Vmware虚拟机安装ubuntu18,虚拟机主要用来进行代码编译,建立mosquitto server测试环境。 1. ubuntu 安装mosquitto 安装mosquitto网上很多教程&…

CDN(内容分发网络)

CDN的全称是 Content Delivery Network, 即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞&a…

音乐播放器应用——Android开发组件化实例分析

组件化技术在Android开发中扮演着重要的角色,它能够将一个庞大的应用拆分成多个独立的组件,每个组件都可以独立开发、测试和维护。本文将深入探讨组件化技术的认知、优势以及搭建过程,并通过代码示例解析组件化实例分析。最后,我们…

C++:类与对象(下)- this指针、(拷贝)构造函数、析构函数、复制运算符重载

目录 一、 this指针 1.1 引入 1.2 问题 1.3 特性 二、 构造函数 2.1 概念 2.2 特性 2.3 语法 2.4 注意点 三、 析构函数 3.1 概念 3.2 特性 3.3 示例 四、拷贝构造函数 4.1 概念 4.2 特性 4.3 示例 4.4 深浅拷贝 五、 赋值运算符重载 5.1 概念 5.2 语法 5…

10-数据结构-队列(C语言)

队列 目录 目录 队列 一、队列基础知识 二、队列的基本操作 1.顺序存储 ​编辑 (1)顺序存储 (2)初始化及队空队满 (3)入队 (4)出队 (5)打印队列 &…

编写一个指令(v-focus2end)使输入框文本在聚焦时焦点在文本最后一个位置

项目反馈输入框内容比较多时候,让鼠标光标在最后一个位置,心想什么奇葩需求,后面试了一下,是有点影响体验,于是就有了下面的效果,我目前的项目都是若依的架子,用的是vue2版本。vue3的朋友想要使…

什么是POP3协议?

POP3(Post Office Protocol Version 3)是一个用于从电子邮件服务器获取邮件的应用层协议。以下是关于POP3的详细解释: 基本操作:使用POP3,电子邮件客户端可以从邮件服务器上下载电子邮件,并将其保存在本地。…

Unity制作护盾——3、蜂窝晶体护盾

Unity制作晶格护盾 大家好,我是阿赵。 继续来做护盾,这一期做一个蜂窝晶体护盾的效果。 一、效果展示 这个晶体护盾的特点是,整个护盾是由很多五边形和六边形的晶体构成,每一块晶体的颜色都在不停的变化,然后每一块晶…

使用 Spring Boot 发送电子邮件(SMTP 集成)

本文探讨了 Spring Boot 与 SMTP 的集成以及如何从您自己的 Spring Boot 应用程序发送电子邮件。 本文探讨如何从您自己的Spring Boot应用程序发送电子邮件。 是的,您可以拥有专用的 REST API,它接受电子邮件发送者和接收者的电子邮件地址、主题…