Python实现动态条形图绘制的示例代码
作者:古明地觉 发布时间:2021-09-25 03:05:17
标签:Python,动态,条形图
两年前在 B 站上看到了一个宝藏 up 主,名叫 "Jannchie见齐",专门做动态条形图样式的数据可视化。
做出的效果还是很不错的,但工具使用的是 JS,不是 Python。于是尝试搜索了一下,看看 Python 有没有相关的库,也能轻松做出动态条形图的效果。幸运的是还真有相关的库,叫 bar_chart_race,那么下面就来看看它的用法。
老规矩,使用之前先安装,直接 pip install bar-chart-race 即可。
import pandas as pd
import bar_chart_race as bcr
# 如果出现SSL错误, 则全局取消证书验证
"""
import ssl
ssl._create_default_https_context = \
ssl._create_unverified_context
"""
# 获取数据
df = pd.read_csv('covid19_tutorial.csv',
index_col=["date"])
# 生成 GIF 图像
bcr.bar_chart_race(df, "covid19_horiz.gif")
我们看到代码非常简单,就是将数据转成 pandas 的 DataFrame,然后调用 bar_chart_race 即可生成 GIF 图像。
整体还是不错的,然后重点来看一下数据:
其中表头就是 GIF 图表中 Y 轴的部分,但要注意的是,我们的图表是随时间不断变化的,所以在生成 DataFrame 的时候必须将 date 字段设置为索引。然后数据随着时间不断变化,条形图之间会根据数据的大小进行排序。
当然了,以上只是默认生成的,bar_chart_race 里面还有很多的参数,我们来看一下。
动态条形图变动态柱状图
import pandas as pd
import bar_chart_race as bcr
df = pd.read_csv('covid19_tutorial.csv',
index_col=["date"])
bcr.bar_chart_race(df, "covid19_horiz.gif",
orientation='v')
我们看到为了避免文字发生重叠,自动倾斜了,所以还是比较人性化的。
指定排序方式
排序方式默认为降序,也可以指定为升序。
import pandas as pd
import bar_chart_race as bcr
df = pd.read_csv('covid19_tutorial.csv',
index_col=["date"])
# 设置排序方式
bcr.bar_chart_race(df, "covid19_horiz.gif",
sort='asc')
限制条目数
import pandas as pd
import bar_chart_race as bcr
df = pd.read_csv('covid19_tutorial.csv',
index_col=["date"])
# 设置最多能显示的条目数,这里最多显示 6 条
bcr.bar_chart_race(df, 'covid19_horiz.gif',
n_bars=6)
设置固定条目
import pandas as pd
import bar_chart_race as bcr
df = pd.read_csv('covid19_tutorial.csv',
index_col=["date"])
# 选取如下 5 个国家的数据
bcr.bar_chart_race(df, 'covid19_horiz.gif',
fixed_order=['Iran', 'USA', 'Italy',
'Spain', 'Belgium'])
固定数值轴,使其不发生动态变化
import pandas as pd
import bar_chart_race as bcr
df = pd.read_csv('covid19_tutorial.csv',
index_col=["date"])
# 设置数值的最大值,固定数值轴
bcr.bar_chart_race(df, 'covid19_horiz.gif',
fixed_max=True)
设置图像帧数,默认 10 帧
import pandas as pd
import bar_chart_race as bcr
df = pd.read_csv('covid19_tutorial.csv',
index_col=["date"])
# 图像帧数:数值越小,越不流畅;越大,越流畅
bcr.bar_chart_race(df, 'covid19_horiz.gif',
steps_per_period=3)
可以看到,动图变得不流畅了。
设置帧率,单位时间默认为 500ms
import pandas as pd
import bar_chart_race as bcr
df = pd.read_csv('covid19_tutorial.csv',
index_col=["date"])
# 设置帧率为 200ms,总共 20 帧
bcr.bar_chart_race(df, 'covid19_horiz.gif',
steps_per_period=20,
period_length=200)
设置每帧增加的标签时间,默认为 False
import pandas as pd
import bar_chart_race as bcr
df = pd.read_csv('covid19_tutorial.csv',
index_col=["date"])
bcr.bar_chart_race(df, 'covid19_horiz.gif',
interpolate_period=True)
图形样式设置
import pandas as pd
import bar_chart_race as bcr
df = pd.read_csv('covid19_tutorial.csv', index_col=["date"])
"""
figsize: 设置画布大小,默认 (6, 3.5)
dpi: 图像分辨率,默认 144
label_bars: 显示柱状图的数值信息,默认为 True;
指定为 False 则不显示;指定为字典,则自定义显示属性
period_label: 显示时间标签信息,默认为 True;
指定为 False 则不显示;指定为字典,则自定义显示属性
period_fmt: 设置日期格式
title: 图表标题
title_size: 标题字体大小
shared_fontdict: 全局字体属性,例如
{'family': 'Helvetica', 'weight': 'bold',
'color': 'rebeccapurple'}
"""
bcr.bar_chart_race(df, 'covid19_horiz.gif', figsize=(5, 3),
dpi=100, label_bars=False,
period_label={'x': .99, 'y': .1,
'ha': 'right',
'color': 'red'},
title='COVID-19 Deaths by Country')
条形图属性,可以设置透明度,边框等
import pandas as pd
import bar_chart_race as bcr
df = pd.read_csv('covid19_tutorial.csv',
index_col=["date"])
# bar_kwargs:条形图属性
bcr.bar_chart_race(df, 'covid19_horiz.gif',
bar_kwargs={'alpha': .2,
'ec': 'black',
'lw': 3})
添加动态文本
import pandas as pd
import bar_chart_race as bcr
import matplotlib.pyplot as plt
# 设置字体,否则无法显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows
# plt.rcParams['font.sans-serif'] = ['Hiragino Sans GB'] # Mac
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_csv('covid19_tutorial.csv', index_col=["date"])
def summary(values, ranks):
# 动态文本的内容
"""
values 为 df 的每一行(Series),例如
Belgium 1143.0
China 3326.0
France 6520.0
Germany 1275.0
Iran 3294.0
Italy 14681.0
Netherlands 1490.0
Spain 11198.0
USA 7418.0
United Kingdom 3611.0
Name: 2020-04-03, dtype: float64
ranks 则是针对 values 的值进行了排名,例如
Belgium 1.0
China 5.0
France 7.0
Germany 2.0
Iran 4.0
Italy 10.0
Netherlands 3.0
Spain 9.0
USA 8.0
United Kingdom 6.0
Name: 2020-04-03, dtype: float64
"""
all_people = int(values.sum())
ranks_country = ranks.sort_values().index
s = (f'总死亡人数:{all_people},'
f'死亡人数最多的国家:{ranks_country[-1]},'
f'死亡人数最少的国家:{ranks_country[0]}')
# 设置文本位置、数值、大小、颜色等
return {'x': .99, 'y': .05, 's': s,
'ha': 'right', 'size': 8}
# 添加文本
bcr.bar_chart_race(df, 'covid19_horiz.gif',
period_summary_func=summary)
添加垂直条
import pandas as pd
import bar_chart_race as bcr
df = pd.read_csv('covid19_tutorial.csv',
index_col=["date"])
# 设置垂直条数值,分位数
def func(values, ranks):
return values.quantile(.9)
# 添加垂直条
bcr.bar_chart_race(df, 'covid19_horiz.gif',
perpendicular_bar_func=func)
设置柱状图颜色
import pandas as pd
import bar_chart_race as bcr
df = pd.read_csv('covid19_tutorial.csv',
index_col=["date"])
"""
# 具体有哪些颜色,可以通过如下方式查看
from bar_chart_race._colormaps import colormaps
print(list(colormaps.keys()))
"""
bcr.bar_chart_race(df, 'covid19_horiz.gif',
cmap="plotly3")
来源:https://mp.weixin.qq.com/s/yXr2MOguyLqK6wxIgXE7dw


猜你喜欢
- 近日在Ubuntu上安装了一个 MySQL 5.0,因为使用 phpMyAdmin 还必须安装 PHP,所以打算直接使用远程管理工具Navi
- 起步在我的印象中,python的机制会自动清理已经完成任务的子进程的。通过网友的提问,还真看到了僵尸进程。import multiproce
- 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因。在操作系统提供的调用中,返回错误
- 本期我们将展示一种对路面类型和质量进行分类的方法及其步骤。为了测试这种方法,我们使用了我们制作的RTK数据集。路面分类该数据集[1]包含用低
- 目录1、封装1.1 私有属性和私有方法2、继承2.1 方法的重写2.2 在子类方法中调用父类方法2.3 多继承2.4 新式类和经典类3、多态
- 1. 卡住是怎么办按照以下步骤, 前提是你需要懂点英文:尽可能自己想办法解决仔细阅读相关文档, 确保不错过任何相关内容在Google, 百度
- 目录一、pyecharts绘制词云图WordCloud.add()方法简介二、绘制词云图对应轮廓按diamond显示三、对应完整代码如下所示
- 可以对未初始化的map进行取值,但取出来的东西是空:var m1 map[string]stringfmt.Println(m1["
- 问题描述最近~ 发现对series里的元素操作挺复杂的,用for loop + Series.iloc[i]会发生卡死的状况,那么,lamb
- 目录01 安装02 剪辑01 安装对视频进行批量剪辑,需要三个库,分别是Moviepy库和Pathlib库,还有Tkinter库。首先我们对
- SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML, 数据定义语言DDL,数据控制语言DCL。其中用于定义数据的结构,比如 创建
- 摘要:面部识别技术的应用越来越广泛,它广泛应用于安全系统、人机交互、社交媒体、医疗保健等领域。本文介绍了基于Python的人脸识别技术,包括
- python里使用正则表达式的组嵌套实例详解由于组本身是一个完整的正则表达式,所以可以将组嵌套在其他组中,以构建更复杂的表达式。下面的例子,
- MySQL开启通用查询日志general log mysql打开general log之后,所有的查询语句都可以在general log文件
- 本文的JS效果是在鼠标点击ITEM标签的时候,实现下方的内容跟随滚动切换的效果,我们先来看下运行后的效果图。以下是脚本之家原创的运行代码:&
- 一:C# 连接SQL数据库 Data Source=myServerAddress;Initial Catalog=
- 【ThinkPHP版本查询】dump(THINK_VERSION);模板获取get参数{$Think.get.pageNumber}或者$R
- 水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。本文将通过Python代码实现打印水仙花数,具体如
- 本文实例讲述了Go语言中嵌入C语言的方法。分享给大家供大家参考。具体分析如下:Go语言官方带了一个工具叫cgo,可以很方便的在Go语言代码中
- 本篇阅读的代码实现了将输入的数字转化成一个列表,输入数字中的每一位按照从左到右的顺序成为列表中的一项。本篇阅读的代码片段来自于30-seco