两个官方示例。
第一个示例比较简单,代码如下。
from matplotlib import pyplot as plt
import pandas as pd
import pynimate as nim
# 数据格式+索引
df = pd.DataFrame(
{
"time": ["1960-01-01", "1961-01-01", "1962-01-01"],
"Afghanistan": [1, 2, 3],
"Angola": [2, 3, 4],
"Albania": [1, 2, 5],
"USA": [5, 3, 4],
"Argentina"
: [1, 4, 5],
}
).set_index("time")
# Canvas类是动画的基础
cnv = nim.Canvas()
# 使用Barplot模块创建一个动态条形图, 插值频率为2天
bar = nim.Barplot(df, "%Y-%m-%d", "2d")
# 使用了回调函数, 返回以月、年为单位格式化的datetime
bar.set_time(callback=lambda i, datafier: datafier.data.index[i].year)
# 将条形图添加到画布中
cnv.add_plot(bar)
cnv.animate()
plt.show()
Canvas类是动画的基础,它会处理matplotlib图、子图以及创建和保存动画。
Barplot模块创建动态条形图,有三个必传参数,data、time_format、ip_freq。
分别为数据、时间格式、插值频率(控制刷新频率)。
效果如下,就是一个简单的动态条形图。
我们还可以将结果保存为GIF或者是mp4,其中mp4需要安装ffmpeg。
# 保存gif, 1秒24帧
cnv.save("file", 24, "gif")
# 电脑安装好ffmpeg后, 安装Python库
pip install ffmpeg-python
# 保存mp4, 1秒24帧
cnv.save("file", 24 ,"mp4")
第二个示例相对复杂一些,可以自定义参数,样式设置成深色模式。
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
import pynimate as nim
# 更新条形图
def post_update(ax, i, datafier, bar_attr):
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
ax.spines["bottom"].set_visible(False)
ax.spines["left"].set_visible(False)
ax.set_facecolor("#001219")
for bar, x, y in zip(
bar_attr.top_bars,
bar_attr.bar_length,
bar_attr.bar_rank,
):
ax.text(
x - 0.3,
y,
datafier.col_var.loc[bar, "continent"],
ha="right",
color="k",
size=12,
)
# 读取数据
df = pd.read_csv("sample.csv").set_index("time")
# 分类
col = pd.DataFrame(
{
"columns": ["Afghanistan", "Angola", "Albania", "USA", "Argentina"],
"continent": ["Asia", "Africa", "Europe", "N America", "S America"],
}
).set_index("columns")
# 颜色
bar_cols = {
"Afghanistan": "#2a9d8f",
"Angola": "#e9c46a",
"Albania": "#e76f51",
"USA": "#a7c957",
"Argentina": "#e5989b",
}
# 新建画布
cnv = nim.Canvas(figsize=(12.8, 7.2), facecolor="#001219")
bar = nim.Barplot(
df, "%Y-%m-%d", "3d", post_update=post_update, rounded_edges=True, grid=False
)
# 条形图分类
bar.add_var(col_var=col)
# 条形图颜色
bar.set_bar_color(bar_cols)
# 标题设置
bar.set_title("Sample Title", color="w", weight=600)
# x轴设置
bar.set_xlabel("xlabel", color="w")
# 时间设置
bar.set_time(
callback=lambda i, datafier: datafier.data.index[i].strftime("%b, %Y"), color="w"
)
# 文字显示
bar.set_text(
"sum",
callback=lambda i, datafier: f"Total :
{np.round(datafier.data.iloc[i].sum(),2)}",
size=20,
x=0.72,
y=0.20,
color="w",
)
# 文字颜色设置
bar.set_bar_annots(color="w", size=13)
bar.set_xticks(colors="w", length=0, labelsize=13)
bar.set_yticks(colors="w", labelsize=13)
# 条形图边框设置
bar.set_bar_border_props(
edge_color="black", pad=0.1, mutation_aspect=1, radius=0.2, mutation_scale=0.6
)
cnv.add_plot(bar)
cnv.animate()
# 显示
# plt.show()
# 保存gif
cnv.save("example3", 24, "gif")
效果如下,可以看出比上面的简单示例好看了不少。
另外作者还提供了相关的接口文档。
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~